2014-02-16 6 views
1

взгляд на этот простой код:кнопки Java перекрашивать

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

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

когда я нажимаю таблицы просмотра, а затем просматриваю все (это bu ttons, которые работают сейчас) и первое окно скрывается, и появляется новое окно, теперь, когда я закрываю второе окно, первый появляется видимым, но кнопки не видны, я должен навести курсор мыши, чтобы они были видны еще раз. Ive пытался mainFrame.revalidate(); и

mainFrame.repaint(); 

, но никакого результата им с помощью окна 8.1 про

+0

См. Править для ответа. Просьба указать, что вы прочитали мой ответ. У меня есть больше, что я могу добавить, но нет смысла тратить усилия, если это ни к чему. –

ответ

1

Одна из проблем, с кодом, и я не уверен, если это является основной проблемой, так как ваш код работает отлично на моей системе , заключается в том, что вы вызываете setVisible(true) в главное окно до, вы добавили все свои компоненты. Его следует называть только после, все компоненты были добавлены.

Другие проблемы, не связанные с вашим основным вопросом:

  • Вы должны избегать использования нулевого макета. Хотя использование нулевого макета может показаться новичку лучшим способом создания сложных графических интерфейсов, это ошибка, и больше вы создаете графический интерфейс Swing, тем больше вы учитесь уважать и использовать менеджеров макетов и видите, что эти существа очень помогают в создании гибких, красивых и, если нужно, сложные GUI. Затем вы можете позволить им правильно настроить себя, позвонив pack(), прежде чем устанавливать их видимыми.
  • Похоже, что вы действительно хотите использовать CardLayout для обмена видами на одном графическом интерфейсе, а не на плече нескольких графических интерфейсов пользователя.
  • Если вы абсолютно должны отображать диалоговое окно, вам следует использовать JDialog, а не JFrame. Если вы использовали модальный JDialog, вам не понадобится WindowListener.

Редактировать

  • ОК, большая проблема, которую я вижу, что вы используете нулевой макет и добавление JLabel, который охватывает всю ContentPane, а затем добавлять компоненты к тому же ContentPane.
  • Вместо этого сделайте JLabel вашей площадкой для контента, а затем добавьте JButtons и т. Д. В .
  • Но убедитесь, что непрозрачное свойство JLabel имеет значение true.

Edit 2
Если вам нужно использовать изображение в качестве фонового изображения Вы можете:

  • поместить изображение в ImageIcon, поставить икону в JLabel, и снова используйте JLabel как ваш контент. Опять же, вам нужно будет сделать JLabel непрозрачным, набрав на нем setOpaque(true). Это хорошо работает, если вы не хотите изменять размер изображения или окна.
  • Если вам нужно изменить размер изображения, лучше, чтобы JPanel нарисовал изображение в своем методе paintComponent(Graphics g), а затем используйте этот JPanel в качестве вашей контент-панели.
  • После того, как вы создали свою панель контента, установите ее макет и добавьте к нему свои компоненты.
  • Затем вызовите setContentPane(newContentPane) на свое окно верхнего уровня и перейдите в новую область содержимого.
+0

woooooow, nononono, спасибо за все остальные советы о том, как создать программу, но теперь я вижу, что не так: D сначала нарисованы кнопки, затем фон: D , и именно поэтому он работает на всех остальных, кроме моих: D У меня нет фона, но я: D плохо помните, как развернуть программу, используя ваши советы, но пока как я устанавливаю индекс az, если есть такая вещь? – Shago

+0

@ user3316177: см. ** Редактировать 2 **. –

Смежные вопросы