2012-02-10 60 views
1

我的軟件的用戶需要能夠點擊不同的選項卡以查看不同類型的數據表示。但是,下面的代碼在用戶單擊選項卡時並未顯示請求的數據面板。在Java中的JInternalFrame中設置JTabbedPane上的JPanel的尺寸

您可以輕鬆地運行下面的代碼,然後按照GUI中的這些步驟,該代碼將產生重新創建問題:

1.) Select "New" from the file menu  
2.) Click on "AnotherTab" in the internal frame which will appear 

根據這些代碼註釋掉以下行,該選項卡將顯示一個空白麪板或在面板頂部的中間顯示一個微小的紅色正方形。

的代碼,你可以切換/註釋掉重現這個問題的線路有:

GraphPanel myGP = new GraphPanel(); 
//GraphPanel myGP = new GraphPanel(width,height); 

這些代碼行是在下面GraphGUI.java。

任何人都可以告訴我如何解決下面的代碼,這樣我的GP顯示在包含它的面板的全尺寸?

下面是重現該問題所需的三個Java文件:

ParentFrame.java

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Panel; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 

import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JTabbedPane; 
import javax.swing.KeyStroke; 

public class ParentFrame extends JFrame implements ActionListener{ 
private static final long serialVersionUID = 1L; 
JLayeredPane desktop; 
JInternalFrame internalFrame; 

public ParentFrame() { 
    super("Parent Frame"); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setPreferredSize(new Dimension(800, 400)); 
    Panel p = new Panel(); 
    this.add(p, BorderLayout.SOUTH); 
    desktop = new JDesktopPane(); 
    setJMenuBar(createMenuBar()); 
    this.add(desktop, BorderLayout.CENTER); 
    this.pack(); 
    this.setSize(new Dimension(800, 600)); 
    this.setLocationRelativeTo(null); 
} 
protected JMenuBar createMenuBar() { 
    JMenuBar menuBar = new JMenuBar(); 
    //Set up the File menu. 
    JMenu FileMenu = new JMenu("File"); 
    FileMenu.setMnemonic(KeyEvent.VK_F); 
    menuBar.add(FileMenu); 
    //Set up the first menu item. 
    JMenuItem menuItem = new JMenuItem("New"); 
    menuItem.setMnemonic(KeyEvent.VK_N); 
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.ALT_MASK)); 
    menuItem.setActionCommand("new"); 
    menuItem.addActionListener(new OpenListener()); 
    FileMenu.add(menuItem); 
    //Set up the second menu item. 
    menuItem = new JMenuItem("Quit"); 
    menuItem.setMnemonic(KeyEvent.VK_Q); 
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK)); 
    menuItem.setActionCommand("quit"); 
    menuItem.addActionListener(this); 
    FileMenu.add(menuItem); 

    return menuBar; 
    } 
class OpenListener implements ActionListener { 
    private static final int DELTA = 40; 
    private int offset = DELTA; 
    public void actionPerformed(ActionEvent e) { 
     // create internal frame 
     int ifWidth = 600; 
     int ifHeight = 300; 
     internalFrame = new JInternalFrame("Internal Frame", true, true, true, true); 
     internalFrame.setLocation(offset, offset); 
     offset += DELTA; 

     // create jtabbed pane 
     JTabbedPane jtp = createTabbedPane(); 
     internalFrame.add(jtp); 
     desktop.add(internalFrame); 
     internalFrame.pack(); 
     internalFrame.setSize(new Dimension(ifWidth,ifHeight)); 
     internalFrame.setVisible(true); 
    } 
} 
private JTabbedPane createTabbedPane() { 
    JTabbedPane jtp = new JTabbedPane(); 
    jtp.setMinimumSize(new Dimension(600,300)); 
    createTab(jtp, "One Tab"); 
    createTab(jtp, "AnotherTab"); 
    createTab(jtp, "Tab #3"); 
    return jtp; 
} 
private void createTab(JTabbedPane jtp, String s) { 
    if(s=="AnotherTab"){ 
     jtp.getHeight(); 
     jtp.getWidth(); 
     GraphGUI myGraphGUI = new GraphGUI(jtp.getHeight(),jtp.getWidth()); 
     jtp.add(s, myGraphGUI); 
    } 
    else{jtp.add(s, new JLabel("TabbedPane " + s, JLabel.CENTER));} 
} 
public static void main(String args[]) { 
    ParentFrame myParentFrame = new ParentFrame(); 
    myParentFrame.setVisible(true); 
} 
public void actionPerformed(ActionEvent e) {if ("quit".equals(e.getActionCommand())){System.exit(0);}} 
} 

GraphGUI.java:這是一個,您可以切換評論重現問題。

import javax.swing.*; 

class GraphGUI extends JPanel{ 
GraphGUI(int height,int width) { 
    //REPRODUCE ERROR BY COMMENTING OUT EITHER ONE OF NEXT TWO LINES: 
    GraphPanel myGP = new GraphPanel(); 
//  GraphPanel myGP = new GraphPanel(width,height); 
    this.add(myGP); 
    this.setVisible(true);// Display the panel. 
} 
} 

GraphPanel.java:

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

class GraphPanel extends JPanel { 
Insets ins; // holds the panel's insets 
double[] plotData; 
double xScale; 

GraphPanel(int w, int h) { 
    setOpaque(true);// Ensure that panel is opaque. 
    setPreferredSize(new Dimension(w, h));// Set preferred dimension as specfied. 
    setMinimumSize(new Dimension(w, h));// Set preferred dimension as specfied. 
    setMaximumSize(new Dimension(w, h));// Set preferred dimension as specfied. 
} 
GraphPanel() { 
    setOpaque(true);// Ensure that panel is opaque. 
} 

protected void paintComponent(Graphics g){// Override paintComponent() method. 
    super.paintComponent(g);// Always call superclass method first. 
    int height = getHeight();// Get height of component. 
    int width = getWidth();// Get width of component. 
    System.out.println("height, width are: "+height+" , "+width); 
    ins = getInsets();// Get the insets. 
    // Get dimensions of text 
    Graphics2D g2d = (Graphics2D)g; 
    FontMetrics fontMetrics = g2d.getFontMetrics(); 
    String xString = ("x-axis label"); 
    int xStrWidth = fontMetrics.stringWidth(xString); 
    int xStrHeight = fontMetrics.getHeight(); 
    String yString = "y-axis label"; 
    int yStrWidth = fontMetrics.stringWidth(yString); 
    int yStrHeight = fontMetrics.getHeight(); 
    String titleString ="Title of Graphic"; 
    int titleStrWidth = fontMetrics.stringWidth(titleString); 
    int titleStrHeight = fontMetrics.getHeight(); 
    //get margins 
    int leftMargin = ins.left; 
    //set parameters for inner rectangle 
    int hPad=10; 
    int vPad = 6; 
    int numYticks = 10; 
    int testLeftStartPlotWindow = ins.left+5+(3*yStrHeight); 
    int testInnerWidth = width-testLeftStartPlotWindow-ins.right-hPad; 
    int remainder = testInnerWidth%numYticks; 
    int leftStartPlotWindow = testLeftStartPlotWindow-remainder; 
    System.out.println("remainder is: "+remainder); 
    int blueWidth = testInnerWidth-remainder; 
    int blueTop = ins.bottom+(vPad/2)+titleStrHeight; 
    int bottomPad = (3*xStrHeight)-vPad; 
    int blueHeight = height-bottomPad-blueTop; 

    g.setColor(Color.red); 
    int redWidth = width-leftMargin-1; 
    //plot outer rectangle 
    g.drawRect(leftMargin, ins.bottom, redWidth, height-ins.bottom-1); 
    System.out.println("blueWidth is: "+blueWidth); 
    // fill inner rectangle 
    g.setColor(Color.white); 
    g.fillRect(leftStartPlotWindow, blueTop, blueWidth, blueHeight); 

    //write top label 
    g.setColor(Color.black); 
    g.drawString(titleString, (width/2)-(titleStrWidth/2), titleStrHeight); 

    //write x-axis label 
    g.setColor(Color.red); 
    g.drawString(xString, (width/2)-(xStrWidth/2), height-ins.bottom-vPad); 
    g2d.rotate(Math.toRadians(-90), 0, 0);//rotate text 90 degrees counter-clockwise 
    //write y-axis label 
    g.drawString(yString, -(height/2)-(yStrWidth/2), yStrHeight); 
    g2d.rotate(Math.toRadians(+90), 0, 0);//rotate text 90 degrees clockwise 
    // plot inner rectangle 
    g.setColor(Color.blue); 
    g.drawRect(leftStartPlotWindow, blueTop, blueWidth, blueHeight); 
} 
} 

回答

4
class GraphGUI extends JPanel { 

    . 
    . 
    GraphGUI(int height,int width) { 
    // components in a GridLayout are stretched to fit space available 
    setLayout(new GridLayout()); 
+0

謝謝你的快速答覆。對不起,我花了這麼長時間才把這個標記爲正確的答案。 +1 – CodeMed 2012-02-21 03:36:27