Swing Probleme mit repaint() bzw. JScrollPane

TheAnfänger

Mitglied
Hallo,
Ich bins mal wieder.

So diesmal habe ich das Problem, dass wenn ich ein JScrollPane
Java:
scroll.setVisible(true);
setze, dann wird mir trotz aufruf von
Code:
repaint();
nichts angezeigt.

Wenn ich das Fenster minimiere und wieder öffne wird es hingegen angezeigt.

Ich schätze also, dass das Problem bei repaint() liegt.

Hätte jemand eine Idee? Ich komme gerade echt nicht weiter.

Der Code kommt später. Ich sitze gerade nicht an meinem Laptop.

Vielen Dank für eure Hilfe
 

Robat

Top Contributor
Ich würde mal ins blaue raten und sagen, dass du setVisible(true) auf deinem JFrame aufrufst und danach erst die JScrollPane hinzufügst.
Aber ohne Code kann man nur raten.
BTW: Du musst du Komponenten die du addest nicht setVisible(true) aufrufen. Die werden beim adden sowieso sichtbar gemacht.
 

TheAnfänger

Mitglied
Ich würde mal ins blaue raten und sagen, dass du setVisible(true) auf deinem JFrame aufrufst und danach erst die JScrollPane hinzufügst.
Leider falsch geraten;)

Ziel ist momentan, dass auf Knopfdruck auf einen JButton ein, dem Button zugeordnetes Menü bzw. in meinem Fall ein JPanel sichtbar wird. Dieses JPanel liegt aufgrund des Layoutmanagers von JScrollPane in einem weiteren JPanel mit einem FlowLayout, welches schlussendlich im JScrollPane liegt. Das JScrollPane liegt schlussendlich in einem weiteren (Haupt-)JPanel namens canvas mit BorderLayout zusammen mit einem anderen JPanel, das die Buttons enthält.

Für eine bessere Übersicht:
-jframe
--canvas(borderlayout)
---jpanel untereReihe
----die ganzen Buttons (momentan nur einer)
---JScrollPane canvasScrollPaneLeft
----JPanel canvasPanelLeft(FlowLayout)
-----beliebige JComponent (momentan nur ein JPanel namens buildsMenu)
------eventuell noch Unterkomponenten (in buildsMenu momentan 10 Buttons).

Hoffe es ist einigermassen verständlich geworden.

Nun noch der Code:
Java:
public class GUI extends JFrame implements ActionListener {
    private static final long serialVersionUID = -7619621152921101049L;

    public static final int STANDARD_HEIGHT = 900, STANDARD_WIDTH = 1200;
    public static final String STANDARD_TITLE = "Rimwar";
   
    public JButton builds;
    public ArrayList<JButton> allButtons;

    public Zeichenflaeche canvas = null;
    public JPanel untereReihe = null;
   
    public JPanel buildsMenu;
   
    public JScrollPane canvasScrollPaneLeft = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    public JPanel canvasPanelLeft = new JPanel();

    // übrigens: JA, die Methode wird (bei der Erstellung von GUI) aufgerufen
    // ich erspare euch nur die ganzen Konstruktoren
    public void init(String title, int width, int height) {
        setTitle(title);
        setSize(width, height);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
       
        canvasScrollPaneLeft.setViewportView(canvasPanelLeft);
        canvasScrollPaneLeft.setFocusable(false);
        canvasPanelLeft.setFocusable(false);

        canvas = new Zeichenflaeche();
        canvas.setPreferredSize(new Dimension(width, height));
        canvas.setFocusable(true);
        canvas.setLayout(new BorderLayout());
       
        canvas.add(canvasScrollPaneLeft, BorderLayout.WEST);
        canvasScrollPaneLeft.setVisible(false);
       
        add(canvas, BorderLayout.CENTER);
       
        allButtons = new ArrayList<JButton>();
       
        builds = new JButton("Build things");
        builds.setActionCommand("build");
        allButtons.add(builds);
       
        buildsMenu = new JPanel(new GridLayout(0, 3));
        //buildsMenu.setBackground(new Color(0, 0, 0, 0));
        buildsMenu.setBackground(Color.BLUE);
        buildsMenu.add(new JButton("1")).setFocusable(false);
        buildsMenu.add(new JButton("2")).setFocusable(false);
        buildsMenu.add(new JButton("3")).setFocusable(false);
        buildsMenu.add(new JButton("4")).setFocusable(false);
        buildsMenu.add(new JButton("5")).setFocusable(false);
        buildsMenu.add(new JButton("6")).setFocusable(false);
        buildsMenu.add(new JButton("7")).setFocusable(false);
        buildsMenu.add(new JButton("8")).setFocusable(false);
        buildsMenu.add(new JButton("9")).setFocusable(false);
        buildsMenu.add(new JButton("10")).setFocusable(false);
        initMenu(buildsMenu);
       
        initButtons();
        pack();
    }
   
    private void initMenu(JComponent menu) {
        menu.setVisible(false);
        Dimension d = menu.getLayout().minimumLayoutSize(menu);
        menu.setPreferredSize(d);
        menu.setSize(d);
        menu.setFocusable(false);
    }

    private void initButtons() {
        final int buttonHeight = 50;
        untereReihe = new JPanel();
        untereReihe.setBackground(new Color(0, 0, 0, 0));
        untereReihe.setPreferredSize(new Dimension(canvas.getPreferredSize().width, buttonHeight));
        untereReihe.setLayout(new GridLayout(1, 0));
        final Color c = new Color(0, 0, 150, 125);
        for (int i=0; i<allButtons.size(); i++) {
            allButtons.get(i).setFocusable(false);
            allButtons.get(i).setBackground(c);
            allButtons.get(i).setForeground(Color.white);
            allButtons.get(i).addActionListener(this);
            untereReihe.add(allButtons.get(i));
        }
        canvas.add(untereReihe, BorderLayout.SOUTH);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if("build".equals(e.getActionCommand())) {
            toggleLeftMenu(buildsMenu);
            /*
            if(buildsMenu.isVisible()) {
                buildsMenu.setVisible(false);
            } else {
                buildsMenu.setVisible(true);
                Dimension d = new Dimension(buildsMenu.getPreferredSize().width+3, canvas.getPreferredSize().height - this.untereReihe.getPreferredSize().height);
                canvasScrollPaneLeft.setPreferredSize(d);
                canvasScrollPaneLeft.setSize(d);
                canvasScrollPaneLeft.setViewportView(buildsMenu);
                canvasScrollPaneLeft.repaint();
                buildsMenu.repaint();
                this.repaint();
            }
            //*/
        }
    }
   
   
    private void toggleLeftMenu(JComponent menu) {
        if(menu.isVisible()) {
            menu.setVisible(false);
            canvasPanelLeft.removeAll();
            canvasScrollPaneLeft.setVisible(false);
        } else {
            menu.setVisible(true);
            canvasPanelLeft.removeAll();
            canvasPanelLeft.add(menu);
            canvasPanelLeft.setPreferredSize(menu.getPreferredSize());
            canvasPanelLeft.validate();
            canvasPanelLeft.setVisible(true);
            canvasScrollPaneLeft.setPreferredSize(new Dimension(canvasPanelLeft.getPreferredSize().width+3, 800));
            canvasScrollPaneLeft.setViewportView(canvasPanelLeft);
            canvasScrollPaneLeft.validate();
            canvasScrollPaneLeft.setVisible(true);
            canvasScrollPaneLeft.repaint();
           
        }
    }
}
 

TheAnfänger

Mitglied
Inzwischen habe ich noch festgestellt, sobald man das Fenster einmal minimiert und danach wieder anzeigen lässt, tritt der Fehler danach nicht mehr auf.
 

Harry Kane

Top Contributor
Mögliche Fehlerquellen:
1. "Zeichenflaeche canvas" hat den falschen Layoutmanager. Der Klassename "Zeichenflaeche" spricht eher dafür, dass du eigene Zeichenroutinen implementieren möchtest, und canvas nicht als Container für Components nutzen möchtest. Du nutzt canvas aber als Container für canvasScrollPaneLeft.
2. canvasPanelLeft hat keine Kindkomponenten, und sollte dementsprechend eine preferred size von ungefähr 0x0 Pixeln haben. Die JScrollPane dürfte versuchen, sich in ihrer Größe dem canvasPanelLeft anzupassen, und dementsprechend unsichtbar sein.
3. Es ist unklar, wo setVisible() auf der Gui-Instanz aufgerufen wird. Irgendwo wird eine solche Instanz sicher erzeugt.
 

TheAnfänger

Mitglied
1. "Zeichenflaeche canvas" hat den falschen Layoutmanager.
Java:
canvas.setLayout(new BorderLayout());
Nope
Der Klassename "Zeichenflaeche" spricht eher dafür, dass du eigene Zeichenroutinen implementieren möchtest, und canvas nicht als Container für Components nutzen möchtest. Du nutzt canvas aber als Container für canvasScrollPaneLeft.
Wenn du es genau wissen willst: Ich programmiere ein kleines Spiel. Die "Zeichenfläche" zeichnet einfach das Spiel. Und darüber sollten dann die Komponenten gezeichnet werden, was meines Erachtens und Wissens nach auch kein Problem sein sollte. (Bei den anderen Elementen hat es ja auch geklappt.) Zudem hat das den Vorteil, dass man die Map auch im Hintergrund sehen kann.
Java:
package main;

import java.awt.Graphics;

import javax.swing.JPanel;

public class Zeichenflaeche extends JPanel {
    private static final long serialVersionUID = 1060267560901578176L;

    public Zeichenflaeche() {
        super();
    }
   
     //*
    @Override
    protected void paintComponent(Graphics gmain) {
        super.paintComponent(gmain);
        Graphics g = gmain.create();
        Start.actualState.render(g);
        /*
        if(Start.actualState == Vars.game) {
           
        } else if(Start.actualState == Vars.menu) {
           
        } else {
            System.err.println("\nZeichenfläche.java:23\nStart.actualState is something different");
        }
        //*/
    }
    //*/
}
2. canvasPanelLeft hat keine Kindkomponenten, und sollte dementsprechend eine preferred size von ungefähr 0x0 Pixeln haben. Die JScrollPane dürfte versuchen, sich in ihrer Größe dem canvasPanelLeft anzupassen, und dementsprechend unsichtbar sein.
Das stimmt zumindest zum Teil: Anfangs weise ich canvasPanelLeft keine Komponenten und auch keine preferredSize zu. Ich habe das aber gerade ausprobiert und es ändert nichts. Anfangs wird keine zugewiesen, später schon. Es ist übrigens auch Sinn der Sache, dass am Anfang nichts angezeigt wird. Ich möchte, dass das canvasPanelLeft (bzw. seine Kindkomponenten) erst sichtbar werden, wenn ein bestimmter Knopf gedrückt wird.

Ich denke das hier ist der wichtigste Part in der Klasse GUI. Ich vermute, dass hier irgendwo ein Fehler liegt:
Java:
    private void toggleLeftMenu(JComponent menu) {
        if(menu.isVisible()) {
            menu.setVisible(false);
            canvasPanelLeft.removeAll();
            canvasScrollPaneLeft.setVisible(false);
        } else {
            canvasPanelLeft.removeAll();
            canvasPanelLeft.add(menu);
            menu.setVisible(true);
            menu.setBounds(0, (int)(canvasScrollPaneLeft.getLayout().preferredLayoutSize(canvasScrollPaneLeft).height-menu.getPreferredSize().getHeight()), (int)menu.getPreferredSize().getWidth(), (int)menu.getPreferredSize().getHeight());
            canvasPanelLeft.setPreferredSize(menu.getPreferredSize());
            canvasPanelLeft.validate();
            canvasPanelLeft.setVisible(true);
            canvasScrollPaneLeft.setPreferredSize(new Dimension(canvasPanelLeft.getPreferredSize().width+3, 800));
            canvasScrollPaneLeft.setViewportView(canvasPanelLeft);
            canvasScrollPaneLeft.validate();
            canvasScrollPaneLeft.setVisible(true);
            canvasScrollPaneLeft.repaint();
           
        }
    }
Java:
    @Override
    public void actionPerformed(ActionEvent e) {
        if("build".equals(e.getActionCommand())) {
            toggleLeftMenu(buildsMenu);
            /*
            if(buildsMenu.isVisible()) {
                buildsMenu.setVisible(false);
            } else {
                buildsMenu.setVisible(true);
                Dimension d = new Dimension(buildsMenu.getPreferredSize().width+3, canvas.getPreferredSize().height-this.untereReihe.getPreferredSize().height);
                canvasScrollPaneLeft.setPreferredSize(d);
                canvasScrollPaneLeft.setSize(d);
                canvasScrollPaneLeft.setViewportView(buildsMenu);
                canvasScrollPaneLeft.repaint();
                buildsMenu.repaint();
            }
            //*/
        }
    }
3. Es ist unklar, wo setVisible() auf der Gui-Instanz aufgerufen wird. Irgendwo wird eine solche Instanz sicher erzeugt.
Ist das so wichtig? Die GUI wird erstellt und direkt auf
Java:
setVisible(true)
gesetzt.

Trotzdem Danke.:)

Ich bin gerade ziemlich ratlos:(. Hat jemand noch weitere Ideen?
Bin für jede Hilfe dankbar.

Freundliche Grüsse
Ein (nicht mehr ganz so blutiger;) Java-) Anfänger
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Repaint Probleme bei Swing (JScrollPane größe ändern) AWT, Swing, JavaFX & SWT 15
E repaint Probleme AWT, Swing, JavaFX & SWT 13
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
W Probleme mit repaint() AWT, Swing, JavaFX & SWT 8
D Repaint Probleme AWT, Swing, JavaFX & SWT 4
F Probleme mit repaint AWT, Swing, JavaFX & SWT 4
I Probleme mit repaint() AWT, Swing, JavaFX & SWT 4
X Probleme mit aktualisierung durch Repaint() Methode AWT, Swing, JavaFX & SWT 3
R Fenster Repaint Probleme AWT, Swing, JavaFX & SWT 7
H JFrame repaint/validate Probleme AWT, Swing, JavaFX & SWT 14
Juelin Probleme bei Stage.close() AWT, Swing, JavaFX & SWT 23
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
U LayoutManager Probleme mit Layouts AWT, Swing, JavaFX & SWT 5
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
M Probleme mit Verkleinern eines GUI AWT, Swing, JavaFX & SWT 7
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
T JTable Graphik probleme AWT, Swing, JavaFX & SWT 3
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
P Probleme mit setIconImage AWT, Swing, JavaFX & SWT 8
U Swing Probleme mit Asynchronen Prozessen und Swing: AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben