我想通过按下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你最后一件事…
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()鼓励容器更新其布局。
revalidate()
repaint()
建议:
JFrame
JPanel
更新
你有两个直接的问题
Clicker
while (true)
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组件带来了很多其他问题,但是我们没有相应的代码,因此无法注释。
Click
立即的解决方案可能是使用:
SwingWorker,请参阅工作线程和SwingWorker了解更多详细信息
SwingWorker
Swing Timer,有关更多详细信息,请参见如何使用Swing计时器
Timer
普通老 Thread
Thread
要记住的事情