如果在同一帧-Java中有多个JPanel,我如何在特定的JPanel中绘制

更新 – 这与我昨天发布的以下链接有关。

https://stackoverflow.com/questions/15916360/swing-gui-application-in-java-with-multiple-frames

如果我在这里做错了,我很抱歉,我试着在我之前的post中写道,我找不到在评论框之外做的方法。

我对我的代码做了一些更改,现在我正在处理3个JPanel。 我为每个面板创建了一个类,除了另一个面板将保存在CardLayout中。 主面板是在我的主类和应用程序中同时创建的。 现在,当我按下按钮时,我试图在两个面板中的一个面板上绘制一张快乐的脸,但它不起作用。

import statements; public class JDataAnalyzerGui extends JFrame { private static final String INTRO = "welcome"; private static final String OPERATIONS = "operations"; private CardLayout cardlayout = new CardLayout(); private JPanel mainPanel = new JPanel(cardlayout); private WelcomePanel welcomePanel = new WelcomePanel(); private OperationPanel operationPanel = new OperationPanel(); private ReadFiles aFileReader; public JDataAnalyzerGui() { // adding panels to the main panel mainPanel.add(welcomePanel.getMainComponent(), INTRO); mainPanel.add(operationPanel.getMainComponent(), OPERATIONS); welcomePanel.addAcceptActionListener(new ActionListener() { //moves to next view where the buttons are and were the drawing should happen @Override public void actionPerformed(ActionEvent e) { int input = Integer.parseInt(welcomePanel.userInput.getText()); boolean isValid = isOptionValid(input); if(isValid) { cardlayout.show(mainPanel, OPERATIONS); performActions(aFileReader); } } }); operationPanel.addReturnActionListener(new ActionListener() { //returns to welcome window @Override public void actionPerformed(ActionEvent e) { Graphics pen = getGraphics(); Object source = e.getSource(); if(source == operationPanel.aButton8) { operationPanel.results.setText(null); welcomePanel.userInput.setText(null); cardlayout.show(mainPanel, INTRO); } 

//当按下button1时我想从operationPanel在panel2上绘制一个String。

  else if(source == operationPanel.aButton1) { operationPanel.results.setText("The maximun opening value was " + Calculations.hiOpenValue); operationPanel.panel2.setBackground(Color.GREEN); pen.setFont(new Font("Broadway", Font.ITALIC, 12)); pen.setColor(Color.MAGENTA); pen.drawString("this is a test", 20, 40); } // code for the rest of buttons } }); } private boolean isOptionValid(int option) { switch(option) { case 1: aFileReader = new ReadFiles("newMSFT.csv"); return true; case 4: Object[] options = { "YES", "CANCEL" }; int reply = JOptionPane.showOptionDialog(null, "Are you sure you want to go?", "Confirm Exit", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); if(reply == JOptionPane.YES_OPTION) System.exit(0); return false; default: JOptionPane.showMessageDialog(null, "That is an invalid option. Please try again"); return false; } } public void performActions(ReadFiles obj) { // code for numeric calculations } private JComponent getMainComponent() { return mainPanel; } private static void createAndShowUI() { JFrame frame = new JFrame("Data Analyzer"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new JDataAnalyzerGui().getMainComponent()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } } 

——————————操作Jpanel导入语句;

 class OperationPanel { JPanel mainPanel = new JPanel(); JPanel panel1 = new JPanel(new FlowLayout()); JPanel panel2 = new JPanel(new FlowLayout()); JPanel panel3 = new JPanel(new FlowLayout()); JLabel results = new JLabel (""); JButton aButton1 = new JButton("Max Open");; // 8 buttons in total, this is the one for painting JButton aButton8 = new JButton("Return to Main"); public OperationPanel() { mainPanel.setLayout(new GridLayout(3, 1)); mainPanel.add(panel1); mainPanel.add(panel3); panel2.setBackground(Color.WHITE); mainPanel.add(panel2); panel1.add(aButton1); // adding all buttons to panel1 panel2.add(results); } public JComponent getMainComponent() { return mainPanel; } public void addReturnActionListener(ActionListener listener) { // el que retorna a welcome view aButton8.addActionListener(listener); aButton1.addActionListener(listener); //addActionListener for all buttons } 

}

——————–欢迎面板类WelcomePanel {

 private JPanel mainPanel = new JPanel(); JPanel panel1 = new JPanel(); JPanel panel2 = new JPanel(new GridLayout(5,1)); JPanel panel3 = new JPanel(new FlowLayout()); JLabel greetings = new JLabel("Welcome to Data Analizer"); Font bigFont = new Font("Comic Sans", Font.BOLD, 30); JLabel label1 = new JLabel("Please select one of these options:"); JLabel label2 = new JLabel("1. newMSFT.csv"); JLabel label3 = new JLabel("2. XXX.csv"); JLabel label4 = new JLabel("3. YYY.csv"); JLabel label5 = new JLabel("4. QUIT"); Font bigFont2 = new Font("Arial", Font.BOLD, 20); JTextField userInput = new JTextField(10); JButton aButton = new JButton("Accept"); public WelcomePanel() { mainPanel.setLayout(new GridLayout(3, 1)); greetings.setFont(bigFont); label1.setFont(bigFont2); label2.setFont(bigFont2); label3.setFont(bigFont2); label4.setFont(bigFont2); label5.setFont(bigFont2); mainPanel.add(panel1); mainPanel.add(panel2); mainPanel.add(panel3); panel1.add(greetings); panel2.add(label1); panel2.add(label2); panel2.add(label3); panel2.add(label4); panel2.add(label5); panel3.add(userInput); panel3.add(aButton); } public void addAcceptActionListener(ActionListener listener) { // este es el que llama a segunda ventana o view aButton.addActionListener(listener); userInput.addActionListener(listener); } public JComponent getMainComponent() { return mainPanel; } 

}

我无法弄清楚如何在特定面板中绘制。

谢谢

你可以…

使用玻璃窗……

在此处输入图像描述

 import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; public class TestGlassPane04 { public static void main(String[] args) { new TestGlassPane04(); } public TestGlassPane04() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new GridLayout(2, 2, 10, 10)); frame.add(createBox(1)); frame.add(createBox(2)); frame.add(createBox(3)); frame.add(createBox(4)); frame.pack(); frame.setLocationRelativeTo(null); frame.setGlassPane(new GlassPane()); frame.getGlassPane().setVisible(true); frame.setVisible(true); } }); } protected JLabel createBox(int box) { JLabel label = new JLabel("Box " + box); label.setBorder(new CompoundBorder(new LineBorder(Color.GRAY), new EmptyBorder(10, 10, 10, 10))); return label; } public class GlassPane extends JPanel { private BufferedImage background; public GlassPane() { setOpaque(false); try { background = ImageIO.read(getClass().getResource("/sillydash.png")); } catch (IOException ex) { ex.printStackTrace(); } } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); if (background != null) { int x = (getWidth() - background.getWidth()) / 2; int y = (getHeight() - background.getHeight()) / 2; g2d.drawImage(background, x, y, this); } g2d.dispose(); } } } 

请查看如何使用根窗格了解更多详细信息……

或者你可以……

使用JXLayer / JLayer完成玻璃窗格的更本地化版本……