我的软件用户需要能够点击不同的标签来查看不同类型的数据表示。但是,当用户单击选项卡时,下面包含的代码不会显示请求的数据面板。
您可以通过运行下面的代码轻松地重新创建问题,然后在代码将生成的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中。
有人可以告诉我如何修复下面的代码,以便myGP以包含它的面板的完整大小显示吗?
以下是重新创建此问题所需的三个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);
}
}
答案 0 :(得分:4)
class GraphGUI extends JPanel {
.
.
GraphGUI(int height,int width) {
// components in a GridLayout are stretched to fit space available
setLayout(new GridLayout());