2017-02-21 38 views
0

我試圖讓這個代碼工作,這樣我有一個cardlayout容器,每個面板都在自己的類和實際文件中定義。這段代碼不是100%我自己的,並且是另一個堆棧溢出用戶對我之前的東西的修改版本。這或多或少是我需要的,但我需要這樣做,因爲它不是自動化的,我可以在每個面板中編寫15個不同的面板並做出決定。 Main和Arrow類是由所述用戶修改的,Imagepanel是我寫一個將被代碼的工作部分接受的類的嘗試。問題是我插入容器的Imagepanel將註冊爲現有的,但面板上沒有顯示,它是空白的。 ImagePanel中的註釋部分是我在後臺刻錄機上設置的代碼,以支持以前在Arrow類中使用的既定內容。Java Swing CardLayout多個文件

這裏是主類

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.*; 
import javax.swing.*; 

public class Main extends JPanel { 
    private Arrow arrow = new Arrow(); //creates a new Arrow object 

public Main() { 
    JPanel btnPanel = new JPanel(); 
    btnPanel.add(new JButton(new NextAction("Next")));  

    setLayout(new BorderLayout()); 
    add(arrow, BorderLayout.NORTH); 
    add(btnPanel, BorderLayout.PAGE_END); 
} 

private class NextAction extends AbstractAction { 
    public NextAction(String name) { 
     super(name); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     arrow.next(); // *** call arrow's public next method that you created 

     // no need to make a new CardLayout instance 
    } 
} 

private static void createAndShowGui() { 
    Main mainPanel = new Main(); 

    JFrame frame = new JFrame("Iowa Budget Simulation"); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.getContentPane().add(mainPanel); 
    frame.pack(); 
    frame.setLocationByPlatform(true); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(() -> createAndShowGui()); 
} 

}

這裏就是容器中創建

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagLayout; 

import javax.swing.*; 

class Arrow extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private CardLayout cardLayout = new CardLayout();  // make me a field 
    private JPanel cardHolder = new JPanel(cardLayout);  //creates a master JPanel 

public Arrow() { 
    for (int i = 0; i < 5; i++) { 
     cardHolder.add(createCard(i), "card " + i); 
    } 
    ImagePanel pear = new ImagePanel(); 
    cardHolder.add(pear, "Pear"); 
    setLayout(new BorderLayout()); 
    add(cardHolder, BorderLayout.NORTH); 

} 

// public method that other objects can call 
public void next() { 
    cardLayout.next(cardHolder); // call next on the correct object 
} 

// simply creates a "pretty" new JPanel 
private JComponent createCard(int i) { 
    JLabel label = new JLabel("Card " + i); 
    label.setFont(label.getFont().deriveFont(Font.BOLD, 50f)); 

    float h = (float)Math.random(); 
    Color c = Color.getHSBColor(h, 1f, 1f); 
    label.setForeground(c.darker()); 

    JPanel panel = new JPanel(new GridBagLayout()); 
    panel.add(label); 
    panel.setBorder(BorderFactory.createLineBorder(c.darker(), 20)); 
    panel.setBackground(c.brighter().brighter()); 

    panel.setPreferredSize(new Dimension(400, 300)); 
    return panel; 
} 

這裏是ImagePanel,我試圖在第3,個別面板箭類/ class

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagLayout; 

import javax.swing.*; 

class ImagePanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private String imgString; 
    private JLabel imgLabel; 

public JComponent ImagePanel() { 
    /* 
    setName("Pear"); 
    JLabel john = new JLabel("Pear"); 

    float h = (float)Math.random(); 
    Color c = Color.getHSBColor(h, 1f, 1f); 
    john.setForeground(c.darker()); 

    JPanel panel = new JPanel(new GridBagLayout()); 
    panel.add(john); 
    panel.setBorder(BorderFactory.createLineBorder(c.darker(), 20)); 
    panel.setBackground(c.brighter().brighter()); 
    // Ensure size is correct even before any image is loaded. 
    setPreferredSize(new Dimension(400, 300)); 
    return panel; 
    */ 

    JLabel label = new JLabel("Pear"); 
    label.setFont(label.getFont().deriveFont(Font.BOLD, 50f)); 

    float h = (float)Math.random(); 
    Color c = Color.getHSBColor(h, 1f, 1f); 
    label.setForeground(c.darker()); 

    JPanel panel = new JPanel(new GridBagLayout()); 
    panel.add(label); 
    panel.setBorder(BorderFactory.createLineBorder(c.darker(), 20)); 
    panel.setBackground(c.brighter().brighter()); 

    panel.setPreferredSize(new Dimension(400, 300)); 
    return panel; 
} 

沒有錯誤發佈,它只是顯示一個空白麪板。感謝您接受我可能提供的任何幫助,並且由於我通過YouTube學習Java Swing GUI和堆棧溢出,因此我提前致歉。

+0

'ImagePanel()'不會做任何事情(它會創建一個空的成分),相反,改變'公共JComponent的ImagePanel(){''到公共ImagePanel(){'所以你現在有一個構造函數。刪除'JPanel panel = new JPanel(new GridBagLayout());'並簡單地調用'setLayout(new GridBagLayout());'並移除對'panel'的其他引用並且它應該開始工作 – MadProgrammer

回答

2

public JComponent ImagePanel() {public JComponent ImagePanel() {不是一個構造函數,它是一種方法,要使它在代碼中工作,您必須將ImagePanel pear = new ImagePanel();更改爲JComponent pear = new ImagePanel().ImagePanel();,但坦白地說,這樣做沒有多大意義。

相反,改變public JComponent ImagePanel() {public ImagePanel() {,現在它是類的構造函數

接下來,改變...

JPanel panel = new JPanel(new GridBagLayout()); 
panel.add(label); 
panel.setBorder(BorderFactory.createLineBorder(c.darker(), 20)); 
panel.setBackground(c.brighter().brighter()); 

panel.setPreferredSize(new Dimension(400, 300)); 
return panel; 

setLayout(new GridBagLayout()); 
add(label); 
setBorder(BorderFactory.createLineBorder(c.darker(), 20)); 
setBackground(c.brighter().brighter()); 

//panel.setPreferredSize(new Dimension(400, 300)); 
//return panel; 

不要讓我開始對爲什麼setPreferredSize是一個壞主意

現在你可以只需使用

ImagePanel pear = new ImagePanel(); 
cardHolder.add(pear, "Pear"); 
+0

解釋爲什麼使用'setPreferredSize )'是一個不明智的想法:http://stackoverflow.com/a/26828479/1368690。基本上,當您使用'setPreferredSize()'時,您不允許組件計算所需的確切大小,這可能會導致部件或額外空間被切掉。 – hamena314

+1

@ hamena314謝謝,我知道,這不是「壞」或「不明智」,但它被過度使用而沒有想到,重寫getPreferredSize通常是更好的選擇,因爲容器通常對需要多少空間有更好的瞭解 – MadProgrammer