Frage zum Schieberegler JSlider

ernst

Top Contributor
Hallo allerseits,
wenn man in dem Programm unten ein Ereignis erzeugt (hier durch Bewegen eines Schiebereglers) wird eine Linie gezeichnet.
(die sich z.B. je nach Stellung des Schiebereglers verändern könnte. Diese verändert sich hier im Programm nicht,
um das Programm nicht noch größer werden zu lassen).
Allerdings bleibt die Zeichenfläche ohne diese Linie, wenn man den Schieberegler nicht bewegt.
Frage:
Wie kann man es erreichen, dass gleich zu Programmanfang die Zeichenfläche nicht leer ist,
sondern die Linie gezeichnet wird?
Habe schon alles Mögliche in main probiert (siehe Kommentar im Quellcode).
Nichts funktioniert.
Wer kann helfen?

mfg
Ernst


Java:
package testslider;

import javax.swing.event.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Startklasse {

    public static void main(String[] args) {
        KSZeichenflaeche ks = new KSZeichenflaeche();
      
        JFrame f = new JFrame();
        f.setSize(1000, 800);
        f.getContentPane().add(ks);
        
        // Hier gibt es ein Problem, wie kann man das beheben?
        //ks.getMalflaeche().maleInsBild();               
        
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.repaint();
    }
}


class KSZeichenflaeche extends JPanel {
    private Malflaeche malflaeche;

    public Malflaeche getMalflaeche() {
        return malflaeche;
    }

    public void setMalflaeche(Malflaeche malflaeche) {
        this.malflaeche = malflaeche;
    }

    public KSZeichenflaeche() {
        init();
    }

    public void init() {
        // --- Elemente, die an die Zeichenfläche angebracht werden sollen: ---
        JSlider schieberegler_ab;       
        GridBagLayout gbl;
        WanzeSchieberegler_ab wanzeSchieberegler_ab;       
        gbl = new GridBagLayout();
        Font font = new Font("Arial", Font.BOLD, 20);

        schieberegler_ab = new JSlider();
        schieberegler_ab.setMinimum(0);
        schieberegler_ab.setMaximum(400);
        schieberegler_ab.setValue(0);
        schieberegler_ab.setOrientation(JSlider.HORIZONTAL);
        schieberegler_ab.setPaintLabels(true);
        schieberegler_ab.setPaintTicks(true);
        schieberegler_ab.setMajorTickSpacing(10);
        Hashtable labelTable_ab = new Hashtable();
        labelTable_ab.put(new Integer(0), new JLabel("0"));
        labelTable_ab.put(new Integer(400 / 2), new JLabel(String.valueOf(400 / 2.0)));
        labelTable_ab.put(new Integer(400), new JLabel(String.valueOf(400)));
        schieberegler_ab.setLabelTable(labelTable_ab);

        malflaeche = new Malflaeche();
        malflaeche.setBackground(Color.WHITE);
        wanzeSchieberegler_ab = new WanzeSchieberegler_ab();
        wanzeSchieberegler_ab.verlinke(this);       
        malflaeche.verlinke(this);
        schieberegler_ab.addChangeListener(wanzeSchieberegler_ab);       
        setLayout(gbl);

        addiereKomponente(gbl, schieberegler_ab, 0, 0, 1, 1, 100, 0);       
        addiereKomponente(gbl, malflaeche, 0, 1, 3, 1, 1, 1);
        
      
        
    }

    public void addiereKomponente(GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        // Beschränkung für Komponente c (z.B. Button)am Layout-Manager anmelden.
        gbl.setConstraints(c, gbc);
        add(c);
    }
}

class Malflaeche extends JPanel {
    private KSZeichenflaeche kSZeichenflaeche;
    private int farbwert;
    private Image image;

    public Malflaeche() {
    }

    public void verlinke(KSZeichenflaeche pKSZeichenflaeche) {
        kSZeichenflaeche = pKSZeichenflaeche;
    }

    public void maleInsBild() {
        Graphics graphics = null;
        int sx, sy;
        double r;

        /*
        Frage ???????????????????????
        Warum liefert sx und sy den Wert 0, wenn man im Konstruktor von
        KSZeichenflaeche aufruft:
        malflaeche.maleInsBild();
         */
        sx = this.getSize().width;
        sy = this.getSize().height;
        image = createImage(sx, sy);

        graphics = image.getGraphics();
        graphics.setColor(getBackground());
        graphics.fillRect(0, 0, sx, sy);

        // Ränderbreite des Zeichenbereichs alle auf 0 setzen
        final java.awt.Insets insets = this.getInsets();
        insets.set(0, 0, 0, 0);
        graphics.setColor(Color.BLACK);
        graphics.drawLine(50, 100, 200, 400);
 
    }
    




    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}

class WanzeSchieberegler_ab implements ChangeListener {
    KSZeichenflaeche kSZeichenflaeche;

    public WanzeSchieberegler_ab() {
    }

    public void verlinke(KSZeichenflaeche pKSZeichenflaeche) {
        kSZeichenflaeche = pKSZeichenflaeche;
    }

    public void stateChanged(ChangeEvent e) {
        Malflaeche malflaeche;
        int ab;
        JSlider s = (JSlider) (e.getSource());
        ab = s.getValue();
        malflaeche = kSZeichenflaeche.getMalflaeche();
        malflaeche.maleInsBild();
        malflaeche.repaint();
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
Warum liefert sx und sy den Wert 0, wenn man im Konstruktor von KSZeichenflaeche aufruft:
Du hast einen Konstruktor ohne Parameter, daher ist width und height erst einmal beides 0. Es gab ja noch keinerlei Aktion, bei der sich dies geändert haben könnte.

// Hier gibt es ein Problem, wie kann man das beheben?
//ks.getMalflaeche().maleInsBild();
Das erst Problem ist, dass Du nur von "ein Problem" sprichst ohne Details zu nennen.

Was ein Problem sein könnte ist wie schon oben: Du führst diese Operation aus, ehe alles initialisiert ist. Wenn Du die Größe vom Frame setzt, dann ist die Größe der JPanel noch lange nicht gesetzt. Das wird erst mit dem setVisible(true) kommen. Denn da wird - beim ersten Mal, das Layout der Komponenten durchgegangen und gesetzt (daher sollte dies immer als Letztes erfolgen nachdem alle Komponenten hinzugefügt wurden - was Du ja auch gemacht hast)

Dann ist wichtig: Du bist im main Thread und nicht im Event Dispatch Thread (EDT). Das andere läuft aber im EDT. Daher könntest Du den Aufruf per SwingUtilities.invokeLater nach dem setVisible machen. Dann wird der EDT erst die Events bearbeiten, die das setVisible auslöst und dann wird der EDT das machen, was Du per invokeLater vorgegeben hast.

Dann ist aber auch noch wichtig: Du malst da etwas. Das wird aber nicht automatisch angezeigt. Du wirst in maleInsBild vermutlich noch ein repaint aufrufen wollen, damit es sichtbar wird.

Das wäre so meine Sicht nach einem überfliegen des Codes. Aber ist nicht ausgetestet und evtl. habe ich da etwas anderes übersehen.
 

ernst

Top Contributor
Dann ist wichtig: Du bist im main Thread und nicht im Event Dispatch Thread (EDT). Das andere läuft aber im EDT. Daher könntest Du den Aufruf per SwingUtilities.invokeLater nach dem setVisible machen.
Danke für deine Antwort.
Frage:
Wie muss ich programmtechnisch "SwingUtilities.invokeLater" u.a. einfügen?
Habe dazu leider keine Ahnung.

mfg
Ernst
 

KonradN

Super-Moderator
Mitarbeiter
Wenn den den Aufruf ks.getMalflaeche().maleInsBild(); über SwingUtilities.invokeLater aufrufen willst, dann könnte es einfach:

SwingUtilities.invokeLater( () -> ks.getMalflaeche().maleInsBild() );

machen.

Kurze Erläuterung:
invokeLater bekommt ein Runnable als Parameter. Das ist ein funktionales Interface mit nur einer Methode ohne Parameter (void run()).
Damit kannst Du es mit einem Lambda Ausdruck machen und der wäre dann einfach () -> .....
 

Blender3D

Top Contributor
Frage ??????????????????????? Warum liefert sx und sy den Wert 0, wenn man im Konstruktor von KSZeichenflaeche aufruft: malflaeche.maleInsBild();

Weil du weder width noch height von Malflaeche setzt und damit 0 zugewiesen wird.

Java:
    sx = this.getSize().width;
    sy = this.getSize().height;
 

ernst

Top Contributor
Hallo allerseits,
habe i main() die fehlende Zeile Code ergänzt.
Danke für eure Tipps.

mfg
E
============================




Java:
package testslider;

import javax.swing.event.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;

public class Startklasse {

    public static void main(String[] args) {
        KSZeichenflaeche ks = new KSZeichenflaeche();
        JFrame f = new JFrame();
        f.setSize(1000, 800);
        f.getContentPane().add(ks);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
      // --------------------------------------------------------
       // Das hat geholfen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        ks.getMalflaeche().maleInsBild();
      // ---------------------------------------------------------
        f.repaint();
        
    }
}


class KSZeichenflaeche extends JPanel {
    private Malflaeche malflaeche;
    
    public Malflaeche getMalflaeche() {
        return malflaeche;
    }

    public void setMalflaeche(Malflaeche malflaeche) {
        this.malflaeche = malflaeche;
    }

    public KSZeichenflaeche() {
        init();
    }

    public void init() {
        // --- Elemente, die an die Zeichenfläche angebracht werden sollen: ---
        JSlider schieberegler_ab;       
        GridBagLayout gbl;
        WanzeSchieberegler_ab wanzeSchieberegler_ab;       
        gbl = new GridBagLayout();
        Font font = new Font("Arial", Font.BOLD, 20);

        schieberegler_ab = new JSlider();
        schieberegler_ab.setMinimum(0);
        schieberegler_ab.setMaximum(400);
        schieberegler_ab.setValue(0);
        schieberegler_ab.setOrientation(JSlider.HORIZONTAL);
        schieberegler_ab.setPaintLabels(true);
        schieberegler_ab.setPaintTicks(true);
        schieberegler_ab.setMajorTickSpacing(10);
        Hashtable labelTable_ab = new Hashtable();
        labelTable_ab.put(new Integer(0), new JLabel("0"));
        labelTable_ab.put(new Integer(400 / 2), new JLabel(String.valueOf(400 / 2.0)));
        labelTable_ab.put(new Integer(400), new JLabel(String.valueOf(400)));
        schieberegler_ab.setLabelTable(labelTable_ab);
        
        malflaeche = new Malflaeche();
        malflaeche.setBackground(Color.WHITE);
        wanzeSchieberegler_ab = new WanzeSchieberegler_ab();
        wanzeSchieberegler_ab.verlinke(this);       
        malflaeche.verlinke(this);
        schieberegler_ab.addChangeListener(wanzeSchieberegler_ab);       
        setLayout(gbl);

        addiereKomponente(gbl, schieberegler_ab, 0, 0, 1, 1, 100, 0);       
        addiereKomponente(gbl, malflaeche, 0, 1, 3, 1, 1, 1);
        
      
        
    }

    public void addiereKomponente(GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        // Beschränkung für Komponente c (z.B. Button)am Layout-Manager anmelden.
        gbl.setConstraints(c, gbc);
        add(c);
    }
}

class Malflaeche extends JPanel {
    private KSZeichenflaeche kSZeichenflaeche;
    private int farbwert;
    //private Image image;
    private BufferedImage bufferimage;   
    
    private Graphics graphics = null;   

    public Malflaeche() {
    }

    public void verlinke(KSZeichenflaeche pKSZeichenflaeche) {
        kSZeichenflaeche = pKSZeichenflaeche;
    }

    public void maleInsBild() {
        //Graphics graphics = null;
        int sx, sy;
        double r;

        /*
        Frage ???????????????????????
        Warum liefert sx und sy den Wert 0, wenn man im Konstruktor von
        KSZeichenflaeche aufruft:
        malflaeche.maleInsBild();
         */
        sx = this.getSize().width;
        sy = this.getSize().height;
        //image = createImage(sx, sy);
        bufferimage = new BufferedImage(sx, sy, BufferedImage.TYPE_INT_RGB);
        
        //_dbGraphics = (Graphics2D)_dbImage.getGraphics();       

        //graphics = image.getGraphics();
        graphics = bufferimage.getGraphics();       
        
        graphics.setColor(getBackground());
        graphics.fillRect(0, 0, sx, sy);

        // Ränderbreite des Zeichenbereichs alle auf 0 setzen
        final java.awt.Insets insets = this.getInsets();
        insets.set(0, 0, 0, 0);
        graphics.setColor(Color.BLACK);
        graphics.drawLine(50, 100, 200, 400);
        repaint();
    }
    




    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //g.drawImage(image, 0, 0, null);
        g.drawImage(bufferimage, 0, 0, null);       
    }
}

class WanzeSchieberegler_ab implements ChangeListener {
    KSZeichenflaeche kSZeichenflaeche;

    public WanzeSchieberegler_ab() {
    }

    public void verlinke(KSZeichenflaeche pKSZeichenflaeche) {
        kSZeichenflaeche = pKSZeichenflaeche;
    }

    public void stateChanged(ChangeEvent e) {
        Malflaeche malflaeche;
        int ab;
        JSlider s = (JSlider) (e.getSource());
        ab = s.getValue();
        malflaeche = kSZeichenflaeche.getMalflaeche();
        malflaeche.maleInsBild();
        malflaeche.repaint();
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 10
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 9
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
D Frage zu ActionListenern und AvtionEvents AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
F JavaFX Frage zum Logging AWT, Swing, JavaFX & SWT 6
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
J Frage zu setuserdata AWT, Swing, JavaFX & SWT 1
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
T JavaFX Frage zum FX-Loader AWT, Swing, JavaFX & SWT 3
B drawRect Frage und Aufgabenstellung AWT, Swing, JavaFX & SWT 10
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
S Frage zu java.awt.EventQueue AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Frage zum Loggen von Fehlern AWT, Swing, JavaFX & SWT 3
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q Cursor Frage AWT, Swing, JavaFX & SWT 8
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
H Taschenrechnerprojekt in Javafx - Frage zu den Buttons in FXML AWT, Swing, JavaFX & SWT 1
I Grundsätzliche Frage zu ItemListener AWT, Swing, JavaFX & SWT 11
X Kurze Frage zu JPopup AWT, Swing, JavaFX & SWT 3
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
J Swing Frage zur Vorgehensweise (JTable?, JLabels?) AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
kaoZ Frage zum einfügen von Componenten AWT, Swing, JavaFX & SWT 14
N Swing JTable anfänger frage AWT, Swing, JavaFX & SWT 2
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D MVC Frage AWT, Swing, JavaFX & SWT 6
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
Luk10 Frage zu Farb-Komposition AWT, Swing, JavaFX & SWT 9
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
V SWT Import Wizard - frage zur WizardPage AWT, Swing, JavaFX & SWT 5
N Swing Frage JXMapviewer AWT, Swing, JavaFX & SWT 4
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
lumo SWT Zeichnen bescheunigen bzw eine allg. Frage AWT, Swing, JavaFX & SWT 8
H Frage zu übergebenem Vector bzw. Boolean AWT, Swing, JavaFX & SWT 3
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
VfL_Freak Swing Frage zu "new JPasswordField( 10 )" AWT, Swing, JavaFX & SWT 6
H Frage zu WindowBuilder Pro AWT, Swing, JavaFX & SWT 3
C Frage/Problem mit Jpanel AWT, Swing, JavaFX & SWT 4
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
GUI-Programmer Zeichnen in Swing - Frage AWT, Swing, JavaFX & SWT 6
Luk10 Frage zu Mouseevents AWT, Swing, JavaFX & SWT 7
J Refreshing Swing Frage AWT, Swing, JavaFX & SWT 10
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
A Frage zu StringBuilder AWT, Swing, JavaFX & SWT 2
S allg. Frage zur GUI-Architektur AWT, Swing, JavaFX & SWT 5
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
H Allgemeine Frage zu Grafikfähigkeiten von Java AWT, Swing, JavaFX & SWT 24
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
Jats Frage zu JLabel & JTextField AWT, Swing, JavaFX & SWT 4
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
hdi Swing Frage zu invokeAndWait() Exceptions AWT, Swing, JavaFX & SWT 8
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
M Frage nach Swing Element AWT, Swing, JavaFX & SWT 3
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
T AWT Frage zu AWT AWT, Swing, JavaFX & SWT 5
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
B SWT Frage zu MVC und Data-Binding AWT, Swing, JavaFX & SWT 8
T LookAndFeel Look and Feel Frage AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
P Kurze Frage zur Gestaltung eines vertikalen Menüs AWT, Swing, JavaFX & SWT 2
Dit_ Frage zum Thema SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 5
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
G Frage zu processMouseEvent AWT, Swing, JavaFX & SWT 6
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
D Swing implementierungs-technische Frage zu JList/AbstractListModel AWT, Swing, JavaFX & SWT 7
C Event Frage AWT, Swing, JavaFX & SWT 7
A Frage zu GridLayout AWT, Swing, JavaFX & SWT 4
F Frage zu WindowListeners AWT, Swing, JavaFX & SWT 2
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
C Frage zu ActionListenern AWT, Swing, JavaFX & SWT 7
D Frage @ someActionEvent.getActionCommand() AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
L Einfache Layout Frage für Applet -> Was mache ich bloss falsch? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben