Пользователи моего программного обеспечения должны иметь возможность нажимать на разные вкладки, чтобы увидеть различные типы представлений данных. Однако приведенный ниже код не отображает запрошенную панель данных, когда пользователь нажимает на вкладку.
Вы можете легко воссоздать проблему, запустив приведенный ниже код, а затем выполнив следующие шаги в графическом интерфейсе, который будет генерировать код:
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);
}
}