看一下这个简单的代码:

Main.java:

package CarManager;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {

    private static final long serialVersionUID = 1L;
    static int width = 400;
    static int height = width / 16 * 9;
    static String title = "Car Manager";
    JButton viewTables = new JButton("View tables");
    JButton clients = new JButton("Clients");
    JButton search = new JButton("Search");
    JButton viewCars = new JButton("View all");
    JButton viewRent = new JButton("Rent a car");
    JButton viewBuy = new JButton("Buy a car");
    JButton viewAccessory = new JButton("Accessory");

    public Main() {

        setLayout(null);
        setLocationRelativeTo(null);
        setTitle(title);
        setSize(width, height);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

        JLabel background = new JLabel(new ImageIcon("res\\background2.jpg"));
        add(background);
        background.setSize(width, height);
        add(viewTables);
        add(clients);
        add(search);
        viewTables.setBounds(20, 20, 110, 30);
        clients.setBounds(20, 70, 110, 30);
        search.setBounds(20, 120, 110, 30);

        viewTables.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                add(viewCars);
                viewCars.setBounds(260, 20, 110, 20);

                add(viewRent);
                viewRent.setBounds(260, 50, 110, 20);

                add(viewBuy);
                viewBuy.setBounds(260, 80, 110, 20);

                add(viewAccessory);
                viewAccessory.setBounds(260, 110, 110, 20);
            }
        });

        viewCars.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                View view = new View();
                view.addWindowListener(new WindowPlug(Main.this));
                setVisible(false);
            }
        });

    }

    public static void main(String args[]) {
        new Main();
    }
}


View.java:

package CarManager;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class View extends JFrame {

    private static final long serialVersionUID = 1L;
    int width = 400;
    int height = width / 16 * 9;
    String title = "View all Cars";

    public View() {
        setLayout(null);
        setLocationRelativeTo(null);
        setTitle(title);
        setSize(width, height);
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setVisible(true);
        JLabel background = new JLabel(new ImageIcon("res\\background2.jpg"));
        add(background);
        background.setSize(width, height);
    }
}


和WindowPlug.java:

package CarManager;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class WindowPlug extends WindowAdapter {

    private Main mainFrame;

    public WindowPlug(Main mainFrame) { // when creating an instance of this
                                        // WindowAdapter, tell it with which
                                        // Main Window you are working with
        this.mainFrame = mainFrame;
    }

    public void windowClosing(WindowEvent e) {
        mainFrame.setVisible(true);
        mainFrame.revalidate();
    }
}


当我单击查看表然后查看全部时(那些是现在可以使用的按钮)
并且第一个窗口隐藏并出现一个新窗口,现在当我关闭第二个窗口时,第一个窗口可见,但按钮不可见,我必须将鼠标悬停以使它们再次可见。香港专业教育学院尝试mainFrame.revalidate();

mainFrame.repaint();


但没有结果
我正在使用Windows 8.1 Pro

最佳答案

您的代码存在一个问题,我不确定这是否是主要问题,因为您的代码在我的系统上可以正常工作,是您在添加所有组件之前在主窗口中调用setVisible(true)。只有在添加了所有组件之后才应调用它。

与您的主要问题无关的其他问题:


您应该避免使用空布局。尽管使用空布局对于新手来说似乎是创建复杂GUI的更好方法,但这是一个谬误,并且您创建Swing GUI越多,您越学会尊重和使用布局管理器,并看到这些生物在创建灵活,美观的过程中起了极大的帮助作用。必要时还可以使用复杂的GUI。然后,您可以通过在设置它们可见之前调用pack()来使它们适当地调整大小。
看来您确实想使用CardLayout在一个GUI上交换视图,而不是在用户身上吐出多个GUI。
如果绝对必须显示对话框,则应使用JDialog,而不是JFrame。如果使用模式JDialog,则不需要WindowListener。




编辑


好的,我看到的一个大问题是您使用的是空布局,并添加了一个覆盖整个contentPane的JLabel,然后将组件添加到了相同的contentPane。
而是将JLabel设置为contentPane,然后将JButtons等添加到其中。
但是请确保首先将JLabel的opaque属性设置为true。




编辑2
如果需要将图像用作背景图像,则可以:


将Image放在ImageIcon中,将Icon放在JLabel中,然后再次使用JLabel作为您的contentPane。同样,您将需要通过在其上调用setOpaque(true)使JLabel不透明。如果您不想更改图像或窗口的大小,则此方法效果很好。
如果确实需要更改图像的大小,最好让JPanel以其paintComponent(Graphics g)方法绘制图像,然后将此JPanel用作contentPane。
创建contentPane后,请设置其布局并向其中添加组件。
然后在顶级窗口上调用setContentPane(newContentPane)并传入新的contentPane。

关于java - Java按钮重画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21815666/

10-12 19:39