我想通过按下JFrame中的按钮来启动另一个JFrame。但是,如果按Button,它将显示JFrame,但其中不显示Buttons和Sliders。
public class MainMenu extends JFrame {
private JFrame klick;
private static final long serialVersionUID = 9002;
public static void main(String[] args) {
new MainMenu();
}
public MainMenu() {
buildGUI1();
}
public void buildGUI1() throws NullPointerException {
setTitle("Hauptmenü");
setSize(800, 480);
setLayout(new GridLayout());
setAlwaysOnTop(false);
setLocation((Toolkit.getDefaultToolkit().getScreenSize().width)/4, (Toolkit.getDefaultToolkit().getScreenSize().height)/4);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
final JButton startclickbt = new JButton("Start Clicker");
startclickbt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
if(klick == null ) {
klick =new Clicker();
add(klick);
}
}
});
add(startclickbt);
}
}
第二个具有完全相同的构造函数。滑块和按钮不是静态的。在应显示“按钮”的位置,屏幕为黑色。
希望你能帮我 :)
编辑:
public class Clicker extends JFrame {
private static final long serialVersionUID = 9001;
protected JPanel panel;
static Click j = null;
protected JSlider jsl;
protected JTextField tf;
static final int CPS_MIN= 0;
static final int CPS_MAX= 100;
static final int CPS_INIT= 25;
private int amount;
private boolean visible;
public int getDelay() {
return Math.abs(jsl.getValue()-100);
}
public int getAmount() {
return amount;
}
public boolean getVisible() {
return visible;
}
public void setOpen(boolean visible) {
this.visible=visible;
}
public Clicker(boolean visible) {
buildGUI(visible);
j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width)/2, (Toolkit.getDefaultToolkit().getScreenSize().height)/2)).addPosition(new Point(getLocation().x+1, getLocation().y+20));
while(true) {
j.runClicks(getDelay());
}
}
public Clicker() {
buildGUI(true);
j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width)/2, (Toolkit.getDefaultToolkit().getScreenSize().height)/2)).addPosition(new Point(getLocation().x+1, getLocation().y+20));
while(true) {
j.runClicks(getDelay());
}
}
public void buildGUI(boolean visible) {
setTitle("Clicker");
setSize(340, 200);
setLayout(new GridLayout());
setAlwaysOnTop(true);
setLocation(0, 0);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(visible);
final JButton bt1 = new JButton("Schließen");
bt1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
final JButton bt2 = new JButton("Start ");
bt2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
j.setClick(true);
}
});
final JButton bt3 = new JButton("Stop ");
bt3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
j.setClick(false);
JOptionPane.showMessageDialog(null, "Klicken gestoppt. Klicks: " + j.getClickAmount());
j.setClickAmout(0);
}
});
final JButton bt4 = new JButton("StartAnzahl");
bt4.addActionListener(new ActionListener() {
private int amount;
public void actionPerformed(ActionEvent e) {
String wert = tf.getText();
try {
amount = Integer.parseInt(wert);
}catch(Exception ee) {
JOptionPane.showMessageDialog(null,"Das war keine Zahl oder mehr als ein Integer");
}
j.doClick(amount);
}
});
tf = new JTextField("Anzahl gewünschte Clicks max "+ Integer.MAX_VALUE, 10);
tf.setEditable(true);
jsl = new JSlider(JSlider.HORIZONTAL,CPS_MIN,CPS_MAX,CPS_INIT);
jsl.setMinorTickSpacing(5);
jsl.setMajorTickSpacing(10);
jsl.setPaintTicks(true);
jsl.setPaintLabels(true);
panel = new JPanel();
panel.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent event) {
j.setClick(false);
}
@Override
public void mouseMoved(MouseEvent event) {
j.setClick(false);
}
});
panel.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_F1) {
j.setClick(true);
}
if(e.getKeyCode() == KeyEvent.VK_F2) {
j.setClick(false);
}
}
});
add(panel);
add(bt2);
add(bt3);
add(bt1);
add(bt4);
add(jsl);
add(tf);
pack();
}
}
做setVisible
你最后一件事…
public void buildGUI1() throws NullPointerException {
setTitle("Hauptmenü");
setSize(800, 480);
setLayout(new GridLayout());
setAlwaysOnTop(false);
setLocation((Toolkit.getDefaultToolkit().getScreenSize().width) / 4, (Toolkit.getDefaultToolkit().getScreenSize().height) / 4);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
final JButton startclickbt = new JButton("Start Clicker");
startclickbt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
if (klick == null) {
klick = new Clicker();
add(klick);
// Add this when you need to add/remove components
revalidate();
repaint();
}
}
});
add(startclickbt);
// Move to here
setVisible(true);
}
另外,在添加新组件时,使用revalidate()
和repaint()
鼓励容器更新其布局。
建议:
JFrame
,而应考虑JPanel
在基础容器中使用a 。这样可以将您的UI释放到更多用例中,并防止您被锁定(因为您无法将框架添加到其他框架)更新
你有两个直接的问题
Clicker
从扩展JFrame
,但是您尝试将其添加到另一个容器中,这在Swing中是不可能的,并且会导致异常,但是…while (true)
循环来阻塞事件调度线程,这意味着Swing无法处理任何新事件,包括repaint
事件例如…
public Clicker(boolean visible) {
buildGUI(visible);
j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height) / 2)).addPosition(new Point(getLocation().x + 1, getLocation().y + 20));
// This is bad
while (true) {
j.runClicks(getDelay());
}
}
public Clicker() {
buildGUI(true);
j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height) / 2)).addPosition(new Point(getLocation().x + 1, getLocation().y + 20));
// This is bad
while (true) {
j.runClicks(getDelay());
}
}
现在,Click
看起来好像它的UI组件带来了很多其他问题,但是我们没有相应的代码,因此无法注释。
立即的解决方案可能是使用:
SwingWorker
,请参阅工作线程和SwingWorker了解更多详细信息
Swing Timer
,有关更多详细信息,请参见如何使用Swing计时器
普通老 Thread
要记住的事情
SwingWorker
和Swing Timer
提供安全更新UI的能力。我知道同样的问题已经被问过很多次了,但是我似乎真的没有在我的代码中发现阻碍JPanel类型的对象显示在JFrame中的错误。下面是扩展JFrame的类的构造函数: 当我运行main方法(这里没有显示)时,它只显示框架和按钮。如果有人能在这方面给点提示,我会非常感谢的。
我已经在我的 JFrame 中添加了一个自定义 JPane 和一个自定义 JMenuBar。JPane显示得很好,但JMenuBar不是。我已经在不同的类中定义了框架和菜单栏 下面是frame类:public类pixel frame {//这个框架将保存用于艺术创作的a pixelPane。这也将包含一个菜单栏,在另一个文件中定义。pixelPane编辑区域;pixelMenuBar菜单栏;pub
问题内容: 我正在有限的时间里进行学校项目,导致代码混乱和混乱。我正在尝试打开两个jFrame,一个显示聊天界面,另一个显示图像。从第一个窗口调用时,我想调用一个方法,该方法多次更改第二个窗口上的图像,并且之间有一些延迟。但是,图像不会改变。 我认为我的问题是由于在文本窗口中使用了一些示例代码,并试图合并我自己的修改而没有完全理解前者。在尝试查找此问题时,我仅发现人们根据计时器和in来更新其jFr
我使用iTextPDF生成PDF,从一些文本输入中获取数据。 当我运行应用程序并创建第一个PDF时,它会按预期生成。 然后我改变一些值并生成另一个值,这就是问题所在。第一个PDF上显示的最后一个条目被打印在第二个生成的PDF的第一个条目的顶部。 不知道为什么会这样?它是保存到缓冲区还是什么的,不是很确定。 下面是生成PDF的代码: 输出请见附件图像,第一个显示第一个文件生成,第二个显示第二个文件生
这是我的代码,当我执行时,我得到的只是一个空白窗口。首先,当我尝试执行时,我得到了这个错误: “无法对非静态字段面板进行静态引用” 所以我把它放在构造器中,但什么都不会显示。
一个没有显示添加到它的的问题。我已经尝试了,我已经切换到只添加,以使代码更短一些。任何帮助都是非常感谢的!