Изменить панель содержимого в JFrame - PullRequest
0 голосов
/ 29 июня 2011

Я видел несколько примеров этого, и я попытался с помощью следующего кода.Я пытаюсь изменить панель содержимого, когда PortraitB выбран, а затем запустить другой файл класса.

//imported java libraries
import java.awt.*;
import java.awt.event.*; 
import java.util.*; 
import javax.swing.UIManager; 
import javax.swing.*;
import javax.swing.border.*;
import java.awt.Dimension;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class birthdayCardGUI implements ActionListener
{

//Welcome Screen
JPanel welcomeP, welcomeImageP, portraitP, landscapeP, backP;
JLabel welcomeImageL;
JButton portraitB, landscapeB, backB;

//Portrait Screen
JTabbedPane tabbedPane;
JPanel portraitOne;
JLabel test;

public JFrame frame;

//Colours
int colourOne = Integer.parseInt( "c1c7f9", 16);
Color Blue = new Color( colourOne );


public birthdayCardGUI() throws Exception
{
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

    JFrame frame = new JFrame("birthday Card Maker!");
    frame.setExtendedState(frame.NORMAL);

    frame.getContentPane().add(create_Content_Pane());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 700); //Size of main window
    frame.setVisible(true);

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

    //sets frame location
    int fw = frame.getSize().width;
    int fh = frame.getSize().height;
    int fx = (dim.width-fw)/2;
    int fy = (dim.height-fh)/2;

    //moves the frame
    frame.setLocation(fx, fy);
}

public JPanel create_Content_Pane() throws Exception
{
    JPanel TotalGUI = new JPanel();
    //TotalGUI.setBackground(Blue);
    TotalGUI.setLayout(null);

    //Welcome Panel
    welcomeP = new JPanel();
    Border etched = BorderFactory.createBevelBorder(10);
    Border titled = BorderFactory.createTitledBorder(etched, "Welcome");
    welcomeP.setBorder(titled);
    welcomeP.setLayout(null);
    welcomeP.setLocation(0,0);
    welcomeP.setSize(485, 680);
    welcomeP.setBackground(Blue);
    TotalGUI.add(welcomeP);

    welcomeImageP = new JPanel();
    welcomeImageP.setLayout(null);
    welcomeImageP.setLocation(88,20);
    welcomeImageP.setSize(324, 225);
    welcomeP.add(welcomeImageP);

    String welcomeG = "Welcome Image.png";
    ImageIcon WelcomeG = new ImageIcon(welcomeG);
    welcomeImageL = new JLabel( WelcomeG, JLabel.CENTER);
    welcomeImageL.setSize(324, 225);
    welcomeImageL.setLocation(0,0);
    welcomeImageP.add(welcomeImageL);

    portraitB = new JButton("Portrait");
    portraitB.setSize(100, 30);
    portraitB.setLocation(200, 295);
    portraitB.addActionListener(this);
    welcomeP.add(portraitB);

    landscapeB = new JButton("Landscape");
    landscapeB.setSize(100, 30);
    landscapeB.setLocation(200, 335);
    landscapeB.addActionListener(this);
    welcomeP.add(landscapeB);

    TotalGUI.setOpaque(true);

    return TotalGUI;

}


public void create_Portrait_Pane()
{
    PortraitGUI portrait = new PortraitGUI();
    getContentPane().removeAll();
    getContentPane().add(portrait.PortraitGUI);
    getContentPane().doLayout();
    update(getGraphics());
}

@Override
public void actionPerformed(ActionEvent e) 
    {
        if(e.getSource() == portraitB)
        {               
            create_Portrait_Pane();
        }
    }

//MAIN METHOD
public static void main(String[] args) throws Exception
{
    birthdayCardGUI CGUI = new birthdayCardGUI();
    }
}

И это файл PortraitGUI, который создает новую панель содержимого.

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

public class PortraitGUI extends JPanel implements ActionListener
{
JPanel frontPageP;
JLabel frontPageL;

//Color White;
int intValue = Integer.parseInt( "FFFFFF", 16);
Color White = new Color(intValue);

public JPanel PortraitGUI() throws Exception
{
    JPanel PortraitGUI = new JPanel();
    PortraitGUI.setLayout(null);

    frontPageP = new JPanel();
    frontPageP.setBackground(White);
    frontPageP.setSize(350, 400);
    frontPageP.setLocation(20, 70);
    PortraitGUI.add(frontPageP);

    frontPageL = new JLabel("Front Page");
    frontPageL.setLocation(10, 5);
    frontPageL.setSize(70, 30);
    frontPageL.setHorizontalAlignment(JTextField.CENTER);
    PortraitGUI.add(frontPageL);        

    PortraitGUI.setOpaque(true);

    return PortraitGUI;
}

public void actionPerformed(ActionEvent e) 
{
}

}

1 Ответ

5 голосов
/ 29 июня 2011

В вашем коде есть несколько проблем, но одна из ваших основных проблем связана с тем, что вы скрываете поле класса JFrame в конструкторе, оставляя поле класса пустым и неиспользуемым.Чтобы это исправить, не объявляйте эту переменную заново.Таким образом, измените это:

JFrame frame = new JFrame("birthday Card Maker!");

на следующее:

// this uses the JFrame variable declared in the class.
frame = new JFrame("birthday Card Maker!"); 

Затем вы можете использовать эту переменную позже в методе, где вы меняете содержимое contentPane:

   public void create_Portrait_Pane() throws Exception {
      PortraitGUI portrait = new PortraitGUI();
      frame.getContentPane().removeAll(); // now you can use the frame variable
      frame.getContentPane().add(portrait);
      //!! getContentPane().doLayout();
      //!! update(getGraphics()); // WTF?
      ((JPanel)frame.getContentPane()).revalidate();
      frame.repaint();
   }

Сказав это, я сам, вероятно, использовал бы JPanel, который использует CardLayout в качестве моего контейнера для обмена представлениями (другими JPanels).

Кроме того, у вас, похоже, здесь есть "псевдо" конструктор:

public JPanel PortraitGUI() throws Exception {

Почему бы просто не использовать настоящий конструктор?:

   public PortraitGUI() throws Exception {
      setLayout(null);

      frontPageP = new JPanel();
      frontPageP.setBackground(White);
      frontPageP.setSize(350, 400);
      frontPageP.setLocation(20, 70);
      add(frontPageP);

      frontPageL = new JLabel("Front Page");
      frontPageL.setLocation(10, 5);
      frontPageL.setSize(70, 30);
      frontPageL.setHorizontalAlignment(JTextField.CENTER);
      add(frontPageL);

      setOpaque(true);
   }

Также для хорошей практики программирования вам следует избегать использования класса Exception с простым ванилью и вместо этого бросать или перехватывать определенныеисключения.

Далее вы захотите избавиться от привычки использовать абсолютный размер и положение и вместо этого использовать менеджеры по расположению для того, что они делают лучше всего.

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

ответов на ваши последние комментарии

Причина, по которой я использовал общедоступный "JPanel" PortraitGUI, заключается в том, что он выдавал ошибку или требуемый тип возврата,

Это исправляло не то, что нужно, поскольку лучшим решением было сделать его истинным конструктором, а не возвращать его.

и я закодировал класс так же, как create_Content_Pane ();с возвращением панели.Кроме того, ошибка требуемого типа возврата появлялась несколько раз.

Опять же, важно знать причину ошибки, а не исправлять ее неправильно.

Обновление(GetGraphics ());также был метод, который я пробовал из примеров кода, которые я нашел с той же проблемой.

Конечно, это не из примера Swing, а скорее из более старого примера AWT.Вы не делаете такого рода кодирование с Swing.

...