gpt4 book ai didi

Java 按钮重绘

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:04 25 4
gpt4 key购买 nike

看看这个简单的代码:

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();
}
}

查看.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 专业版

最佳答案

您的代码有一个问题,我不确定这是否是主要问题,因为您的代码在我的系统上运行良好,是您在添加所有组件之前主窗口上调用setVisible(true)。仅应在添加所有组件后调用它。

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

  • 您应该避免使用空布局。虽然对于新手来说,使用空布局似乎是创建复杂 GUI 的更好方法,但这是一个谬论,您创建 Swing GUI 的次数越多,您就越学会尊重和使用布局管理器,并且会发现这些生物对创建灵活、美观(如果需要的话)复杂的 GUI 有很大帮助。然后,您可以在将它们设置为可见之前调用 pack() 让它们自行调整大小。
  • 看来您确实希望使用 CardLayout 在一个 GUI 上交换 View ,而不是向用户提供多个 GUI。
  • 如果您绝对必须显示对话框窗口,那么您应该使用 JDialog,而不是 JFrame。如果您使用模态 JDialog,则不需要 WindowListener。
<小时/>

编辑

  • 好的,我发现的一个大问题是您使用空布局并添加覆盖整个 contentPane 的 JLabel,然后将组件添加到同一 contentPane。
  • 相反,请将 JLabel 设置为您的 contentPane,然后将 JButton 等添加到
  • 但请确保首先将 JLabel 的 opaque 属性设置为 true。
<小时/>

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com