gpt4 book ai didi

java - 居中 JFrame 不适用于子子类

转载 作者:行者123 更新时间:2023-11-30 07:25:12 25 4
gpt4 key购买 nike

我为项目中的每种不同类型的窗口创建了不同的类。例如,我的主窗口是 MainWindow 的一个实例。项目设置窗口是 ProjectSettingsWindow 的一个实例。我还创建了一个名为 CustomWindow 的类。我会把它命名为 Window,但那已经被采用了。啊。此类包含我的所有窗口共享的内容,例如初始化方法和 JPanel。它扩展了 JFrame,我的所有其他窗口类都扩展了 CustomWindow。

抱歉,这太长了。但这是 SSCCE:(这是我在这里的第一个问题,请耐心等待)

主类:

package beat;

public class Main {
public static StartWindow start = new StartWindow();

public static void main(String[] args) {
start.init(300, 100, "choices, choices");
start.display();
}

public static void close() {
//does other things
System.exit(0);
}
}

启动窗口类:

package beat;
import javax.swing.*;

public class StartWindow extends CustomWindow {
public StartWindow() {
eventHandler = new StartWindowEvents(this);
}

JButton newButton = new JButton();
JButton loadButton = new JButton();

//initialize
public void initBranch() {
initButtons();
//other classes have a few groups to initialize, not just one
}

private void initButtons() {
newButton.setText("new project");
newButton.setSize(120,49);
newButton.setLocation(10,10);
newButton.addActionListener(eventHandler);

loadButton.setText("load project");
loadButton.setSize(120,49);
loadButton.setLocation(164,10);
loadButton.addActionListener(eventHandler);

content.add(newButton);
content.add(loadButton);
}
}

StartWindowEvents 类:

package beat;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;

public class StartWindowEvents extends CustomWindowEvents {
public StartWindowEvents(CustomWindow w) {
super(w);
}

//if a button is pressed
public void actionPerformed(ActionEvent e) {
if (e.getSource() == Main.start.newButton)
newButton();
else if (e.getSource() == Main.start.loadButton)
loadButton();
}

private void newButton(){
//do the newButton stuff
}
private void loadButton() {
//do the loadButton stuff
}
}

自定义窗口类:

package beat;
import javax.swing.*;

public class CustomWindow extends JFrame {
JPanel content = new JPanel(null);
CustomWindowEvents eventHandler;

public void display() {
//whatever you want to refresh, usually nothing
setVisible(true);
}

public void init(int width, int height, String title) {
pack();
setVisible(false);
setResizable(false);
setLocationRelativeTo(null); //center on screen, but it doesnt work
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setContentPane(content);
addWindowListener(eventHandler);

setSize(width, height);
setTitle(title);

initBranch();
}
public void initBranch() {
//whatever you want to do after the window is initialized, usually branch to groups of JComponents
}
}

自定义窗口事件类:

package beat;
import java.awt.event.*;
import javax.swing.JOptionPane;

public class CustomWindowEvents extends WindowAdapter implements ActionListener {
CustomWindow source;

public CustomWindowEvents(CustomWindow w) {
source = w;
}

public void actionPerformed(ActionEvent e) {}

public void windowClosing(WindowEvent e) {
int i = JOptionPane.showConfirmDialog(source,
"DONT DO IT",
"are you sure?",
JOptionPane.YES_NO_OPTION);
if (i == JOptionPane.YES_OPTION)
doClose();
}

public void doClose() {
//whatever you want to do after the window is confirmed closed, usually exit the program
Main.close();
}
}

最佳答案

  • 如果您在窗口上调用 pack() 之后调用 setLocationRelativeTo(null),它将使窗口居中。
  • 您确定您的 init() 方法正在所有 Window 对象上调用吗?你是先调用 pack() 吗?
  • 您的 GUI 类似乎是为创建 JFrame 而设计的,我认为这是一个错误。您最好让它们适应创建 JPanel,因为这会为您的程序提供更大的灵 active 。通过这种方式,您可以在 JFrame、JApplet 或 JDialog 中使用您的 GUI,或在 CardLayout 中用作“卡片”,或在更大的 GUI 中用作子 JPanel,...
  • 避免使用会进行大量窗口切换的 GUI,因为这对用户来说不是很友好。
  • 我怀疑可能过度使用了继承。首先,您很少需要扩展 JFrame,因为我们很少需要重写 JFrame 的方法之一。
  • 编辑 1 您对 setSize(...) 的调用搞砸了,因为它使 pack() 无效。您几乎不应该调用 setSize(...),而是让组件使用 pack() 设置它们自己的首选大小。

编辑2
例如,

public void init(int width, int height, String title) {
// !! pack();
setVisible(false);
setResizable(false);
// !! setLocationRelativeTo(null); // center on screen, but it doesnt work
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setContentPane(content);
addWindowListener(eventHandler);

// !! setSize(width, height);
setPreferredSize(new Dimension(width, height)); // !!
pack(); // !!
setLocationRelativeTo(null); // !!
setTitle(title);

initBranch();
}

如果可以的话,你甚至不应该调用 setPreferredSize(...)(kleopatra 肯定会为这段代码找我),但再次让组件自行调整大小。

关于java - 居中 JFrame 不适用于子子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11042137/

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