更新 - 这与我昨天发布的以下链接有关。
https://stackoverflow.com/questions/15916360/swing-gui-application-in-java-with-multiple-frames
如果我在这里做错了,我很抱歉,我试着在我以前的帖子中写道,而且在评论框之外我找不到办法。
我对我的代码做了一些更改,现在我正在处理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 import语句;
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
}
}
--------------------欢迎面板 class 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;
}
}
我无法弄清楚如何在特定面板中绘图。
由于
答案 0 :(得分:2)
使用玻璃窗格......
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();
}
}
}
请查看How to use Root Panes了解更多详情......
使用JXLayer / JLayer来完成玻璃窗格的更本地化版本......