简体   繁体   中英

Yet another repainting issue in my JFrame

I'm learning Java and testing a simple note taking program. I have a panel that is hidden at startup, and made visible by the click of a button. But I can't see this panel until I resize the window of the program ! I sincerely tried everything I could find online here and there, and still didn't manage to get it running properly. Here is the code :

//Main JFrame "Fenetre"
//imports
...

public class Fenetre extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    private JPanel west = new JPanel();
    private CEPan CEPan = new CEPan();
    private JPanel container = new JPanel();
    private JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, west, CEPan);
    private JButton nouvelleNote = new JButton("Nouvelle note");

    public Fenetre() {
        this.setMinimumSize(new Dimension(800, 700));
        this.setTitle("Notes");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(container);
        container.setBackground(Color.GREEN);
        west.setMinimumSize(new Dimension(100, 700));
        west.add(nouvelleNote);
        nouvelleNote.addActionListener(this);
        CEPan.setMinimumSize(new Dimension(200, 700));
        CEPan.setBackground(Color.RED);

        split.setDividerSize(4);
        container.setLayout(new BorderLayout());
        container.add(split, BorderLayout.CENTER);

        //At first this panel is hidden until the click of the button
        CEPan.setVisible(false);

        this.setContentPane(container);
    }


    public void nouvelleNote() {
        CEPan.setVisible(true);
        container.repaint();
        west.repaint();
        this.repaint();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        nouvelleNote();
    }

}

CEPan

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class CEPan extends JPanel {

    private static final long serialVersionUID = 1L;
    private TextArea titleTF = new TextArea(35);
    private TextArea contentTA = new TextArea(16);
    private JScrollPane scroll = new JScrollPane(contentTA, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    private JScrollPane scrollTitle = new JScrollPane(titleTF);
    public boolean hide;

    public CEPan() {        
        titleTF.setBackground(Color.BLUE);
        this.setLayout(new BorderLayout());
        this.add(scrollTitle, BorderLayout.NORTH);
        this.add(scroll, BorderLayout.CENTER);
        titleTF.setEditable(true);

        contentTA.setLineWrap(true);
        scrollTitle.setBackground(Color.GRAY);
    }
}

TextArea

public class TextArea extends JTextArea {

    private static final long serialVersionUID = 1L;
    private Color couleur = new Color(1, 168, 135);

    public TextArea(int fs) {
        Font font = new Font("Arial", Font.BOLD, fs);
        this.setFont(font);
        this.setForeground(couleur);
        //this.setPreferredSize(new Dimension(40, 40));
    }
}

Notes

public class Notes {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Fenetre fenetre = new Fenetre();
        fenetre.pack();
        fenetre.setVisible(true);
    }
}

When a JComponent has already been displayed and some event causes a modification of such JCompoment, the best way to avoid problems is to always call repaint() and revalidate() on the involved component. The first method causes the component to be repainted in order to show any change involving the components look (eg change a color), the second one notifies the layout manager to recalculate the layout, as it is necessary if some component has been added or removed.

Just add one line of code: resize(900,700) after you make your CEPan visible.

`public void nouvelleNote() {
   CEPan.setVisible(true);
   resize(900, 700);
 }`

This would resize your JFrame and then it will automatically repaint and revalidate all of the components.

I've had this problem before. All you need to replace all repaint method calls with:

yourJFrame.setVisible(true);

Eg.:

public void nouvelleNote() {
    CEPan.setVisible(true);
    this.setVisible(true);
}

Even if the frame is already visible this method will reassure that everything is rendered correctly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM