看一下这个简单的代码:
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/