2017-03-15 67 views
0
出血

JFrame bleed through JInternalFrame的JFrame通過的JInternalFrame

我創建一個桌面應用程序,我想不通爲什麼JFrame的是通過JInternalFrame的出血(見PIC)。我試圖在下面包含相關代碼,所以請忽略丟失的{},它在實際應用程序中運行時沒有錯誤。

public class MainJFrame extends JFrame { 

private static final long serialVersionUID = 2377310559170663631L; 
Container cPane; 
JDesktopPane desktopPane = new JDesktopPane(); 
JPanel deskPanel; 
JButton jButtonCreateWLog, jButtonCreateCLog; 



public static void main(String args[]) { 
    MainJFrame w = new MainJFrame(); 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    int maxX = screenSize.width - 100; 
    int maxY = screenSize.height - 200; 
    w.setPreferredSize(new Dimension(maxX, maxY)); 
    w.setSize(maxX, maxY); 
    w.setTitle("Estes Fitness Help"); 
    w.setVisible(true); 
} 

public MainJFrame() { 
    super("Estes Fitness Help"); 
    getContentPane().add(desktopPane); 
    cPane = getContentPane(); 
    cPane.setLayout(null); 
    initiateComponents(); 
    initiateMenuBar(); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 
private void initiateComponents(){ 

    //Set size to match desktop size 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    int maxX = screenSize.width - 100; 
    int maxY = screenSize.height - 200; 

    //Create panel inside desktop 
    deskPanel = new JPanel(); 
    deskPanel.setName("Weight Log Entry"); 
    deskPanel.setLayout(null); 
    deskPanel.setBackground(new Color(200, 50, 50)); 

    //button for creating a weight log 
    jButtonCreateWLog = new JButton(); 
    jButtonCreateWLog.setText("Create Weight Log"); 
    jButtonCreateWLog.setBounds(80, 120, 150, 25); 
    jButtonCreateWLog.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     jButtonCreateWLogActionPerformed(e); 
     } 
    }); 

    //button for creating a cardio log 
    jButtonCreateCLog = new JButton(); 
    jButtonCreateCLog.setText("Create Cardio Log"); 
    jButtonCreateCLog.setBounds(250, 120, 150, 25); 
    jButtonCreateCLog.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     jButtonCreateCLogActionPerformed(e); 
     } 
    }); 

    //add components to deskPanel 
    deskPanel.add(jButtonCreateWLog); 
    deskPanel.add(jButtonCreateCLog); 
    deskPanel.setSize(maxX, maxY); 
    cPane.add(deskPanel); 

    pack(); 
    setVisible(true); 

} 

private void jButtonCreateWLogActionPerformed(ActionEvent e){ 
    MainJFrameController desktopPaneC = new MainJFrameController(this); 
    desktopPaneC.actionPerformed(e); 

} 

這是MainJFrameController:

public class MainJFrameController implements ActionListener{ 

private MainJFrame desktopFrame; 

public MainJFrameController(){ 

} 

public MainJFrameController(MainJFrame desktopFrame){ 
    this.desktopFrame = desktopFrame; 
    desktopFrame.getCreateWLogButton().addActionListener(this); 
    desktopFrame.getCreateCLogButton().addActionListener(this); 
} 

public void actionPerformed(ActionEvent e) { 
    String action = e.getActionCommand(); 
    if (action.equalsIgnoreCase("Create Weight Log")){ 
     getCreateWLogButton_actionPerformed(e); 
    } else if (action.equalsIgnoreCase("Create Cardio Log")){ 
     getCreateCLogButton_actionPerformed(e); 
    } 
} 

private void getCreateWLogButton_actionPerformed(ActionEvent e) { 
    StoreWeightLogJFrame SWLJFrame = new StoreWeightLogJFrame(); 
    SWLJFrame.pack(); 
    SWLJFrame.setVisible(true); 
    desktopFrame.add(SWLJFrame); 

} 
} 

這是WeightLog的JInternalFrame

public class StoreWeightLogJFrame extends JInternalFrame{ 

private static final long serialVersionUID = 7750452209025354283L; 

JPanel jPanel1; 
JLabel jLabelSets, jLabelReps, jLabelWeight; 
JTextField jTextFieldSets, jTextFieldReps, jTextFieldWeight; 
JButton jButtonSaveWLog; 

public StoreWeightLogJFrame() { 
    super("Store Weight Log"); 
    initiateComponents(); 
    this.add(jPanel1); 
    this.setBounds(0, 0, 505, 505); 
    this.setVisible(true); 
    this.pack(); 
    this.setClosable(true); 
    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    System.out.println("StoreWeightLogJFrame initialized"); 
} 
private void initiateComponents(){ 

    jPanel1 = new JPanel(); 
    jLabelSets = new JLabel(); 
    jTextFieldSets = new JTextField(); 
    jLabelReps = new JLabel(); 
    jTextFieldReps = new JTextField(); 
    jLabelWeight = new JLabel(); 
    jTextFieldWeight = new JTextField(); 
    jButtonSaveWLog = new JButton(); 
    jPanel1.setName("Weight Log Entry"); 
    jPanel1.setLayout(null); 
    jPanel1.setBackground(new Color(255, 50, 50)); 

    jLabelSets.setText("Sets: "); 
    jLabelSets.setBounds(25, 25, 100, 50); 
    jTextFieldSets.setText("3"); 
    jTextFieldSets.setBounds(80, 40, 25, 25); 


    jLabelReps.setText("Reps: "); 
    jLabelReps.setBounds(25, 60, 100, 50); 
    jTextFieldReps.setText("10"); 
    jTextFieldReps.setBounds(80, 75, 25, 25); 

    jLabelWeight.setText("Weight: "); 
    jLabelWeight.setBounds(25, 110, 50, 25); 
    jTextFieldWeight.setText("225"); 
    jTextFieldWeight.setBounds(80, 110, 30, 25); 

    jButtonSaveWLog.setText("Save Log"); 
    jButtonSaveWLog.setBounds(40, 150, 100, 25); 
    jButtonSaveWLog.addActionListener(new java.awt.event.ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     jButtonSaveWLogActionPerformed(e); 
    } 
    }); 

    jPanel1.add(jLabelSets); 
    jPanel1.add(jTextFieldSets); 
    jPanel1.add(jLabelReps); 
    jPanel1.add(jTextFieldReps); 
    jPanel1.add(jLabelWeight); 
    jPanel1.add(jTextFieldWeight); 
    jPanel1.add(jButtonSaveWLog); 
    jPanel1.setBounds(5, 5, 500, 550); 

} 
+0

看起來你有一個z訂購問題 – MadProgrammer

回答

0
getContentPane().add(desktopPane); 
cPane = getContentPane(); 

首先,你的桌面面板添加到內容窗格中。

cPane.add(deskPanel); 

然後稍後將deskPanel添加到內容窗格。

因爲您使用的是空佈局,所以您已將兩個組件添加到同一個容器,並且鼠標懸停在其上時將顯示該按鈕。

不知道究竟你正在嘗試做的,但我猜你應該:

  1. 沒有使用空佈局。 Swing旨在與佈局管理器配合使用
  2. 使用適當的佈局管理器(BorderLayout)在內容窗格上顯示「按鈕面板」和「桌面窗格」以控制每個組件的位置。

所以基本邏輯是這樣的:

JDesktopPane desktop = new JDesktopPane(); 
frame.add(desktop, BorderLayout.CENTER); 

現在,如果你希望你的「按鈕」出現在框架上,你可以爲你的按鈕另一個面板:

JPanel buttonPanel = new JPanel(); 
buttonPanel.add(theFirstButton); 
buttonPanel.add(theSecondButton); 
frame.add(buttonPanel, BorderLayout.PAGE_START); 

現在,該框架將包含一個面板,其中按鈕位於框架頂部,桌面窗格將位於此面板下方。

有關更多信息和工作示例,請參閱Swing教程Layout Managers中的部分。

+0

我會檢查出你的鏈接,一旦我從旅行回來,看看我能否使它工作。 –