Java按钮重绘

时间:2014-02-16 18:38:01

标签: java swing

看看这个简单的代码:

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专业版

1 个答案:

答案 0 :(得分:1)

您的代码存在一个问题,我不确定这是否是主要问题,因为您的代码在我的系统上正常工作,就是您在主窗口之前调用setVisible(true) < / em>您已添加了所有组件。在添加所有组件之后,它应该只被称为

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

  • 您应该避免使用null布局。虽然使用null布局似乎是新手创建复杂GUI的更好方法,但这是一个谬论,你创建Swing GUI越多,你学会尊重和使用布局管理器就越多,并且看到这些生物在创建灵活,美丽方面有很大帮助如果需要,复杂的GUI。然后,您可以在设置它们之前调用pack(),让它们适当地调整自己的大小。
  • 您似乎确实想要使用CardLayout在一个GUI上交换视图,而不是在用户上插入多个GUI。
  • 如果您绝对必须显示一个对话框窗口,那么您应该使用JDialog,而不是JFrame。如果您使用了模态JDialog,则不需要WindowListener。

修改

  • 好的,我看到的一个大问题是你正在使用null布局并添加一个覆盖整个contentPane的JLabel,然后将组件添加到同一个contentPane。
  • 相反,让JLabel成为您的contentPane,然后将您的JButtons等添加到 it
  • 但请确保首先将JLabel的opaque属性设置为true。

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

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