2015-05-01 3 views
0

Как я уже сказал, JButton GR установлен на размер по умолчанию (размер окна), когда я нажимаю JButton MN. Когда программа запущена, JButton GR имеет нужный размер (200 на 20), при нажатии кнопки меню появляется также в нужном размере (200 на 20), но при нажатии кнопки меню GR JButton имеет свой размер по умолчанию. При нажатии на полный размер GR JButton кнопка «Меню» появляется с нужным размером. Я использую BlueJ (школьная доза не позволяет другим IDE).Размер JButton установлен на размер по умолчанию при изменении видимости

import java.util.Scanner; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.JButton; 
public class MAIN 
{ 
    public static void main(String args[]) 
    { 
     ActionClass actionEvent = new ActionClass(); 

     //Main window 
     JFrame Program1 = new JFrame("Program1"); 
     Program1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Program1.setPreferredSize(new Dimension(800, 600)); 
     Program1.pack(); 
     Program1.setVisible(true); 

     //menu button (returns to home Menu) 
     JButton MN = new JButton("MENU"); 
     MN.setBounds(300, 10, 200, 20); 
     MN.setVisible(false); 
     Program1.add (MN); 
     //MN.setActionCommand("1"); 

     // Enter GRC 
     JButton GR = new JButton("GRC"); 
     GR.setBounds(300, 40, 200, 20); 
     GR.setVisible(true); 
     Program1.add (GR); 
     //GR.setActionCommand("2"); 

     GR.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent GRH) 
      { 
       MN.setVisible(true); 
       GR.setVisible(false); 
      } 
     } 
     ); 

     MN.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent MNH) 
      { 
       MN.setVisible(false); 
       GR.setVisible(true); 
      } 
     } 
     ); 

    } 
} 
+0

1) Java GUI должны работать с различными ОС, размером экрана, разрешением экрана и т. Д. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). 2) Пожалуйста, изучите общую номенклатуру Java (соглашения об именах - например, 'EveryWordUpperCaseClass',' firstWordLowerCaseMethod() ',' firstWordLowerCaseAttribute', если это не 'UPPER_CASE_CONSTANT') и использовать ее последовательно. –

+0

'MN.setVisible (true); GR.setVisible (false); 'Используйте [' CardLayout'] (http://download.oracle.com/javase/8/docs/api/java/awt/CardLayout.html), как показано в [этом ответе] (http://stackoverflow.com/a/5786005/418556). –

+1

JButtons MN и GR должны быть объявлены как локальные переменные или отсутствуют окончательные .... – mKorbel

ответ

2

Как ты сказал, что JButton GR является ...

  • JFrame имеет BorderLayout как значение по умолчанию LayoutManager в API,

  • использовать соглашения об именах Java

  • использовать LayoutManager вместо NullLayout и неправильный путь

  • setVisible (true); должна быть последней строкой коды, потому что ваши находятся в опасности, что все JComponents добавляются к уже видимый контейнеру (например, мыши над перекрашивать эти JComponents)

  • использование Initial Thread


  • Простейшие как возможно

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.JButton; 

public class Main { 

    private JFrame myProgram1 = new JFrame("myProgram1"); 
    private JButton myMN = new JButton("MENU"); 
    private JButton myGR = new JButton("myGRC"); 

    public Main() { 
     myGR.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent myGRH) { 
       myMN.setVisible(true); 
       myGR.setVisible(false); 
      } 
     }); 
     myProgram1.add(myMN, BorderLayout.SOUTH); 
     myMN.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent myMNH) { 
       myMN.setVisible(false); 
       myGR.setVisible(true); 
      } 
     }); 
     myProgram1.add(myGR, BorderLayout.NORTH); 
     myProgram1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myProgram1.pack(); 
     myProgram1.setVisible(true); 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Main(); 
      } 
     }); 
    } 
} 
Смежные вопросы