选择 JMenuItem 时更改 JPanel 中的图像
Change image in a JPanel when JMenuItem is chosen
我在使用 JMenu 时遇到问题,我怀疑这是因为我误解了 Jframe 在实时更新方面的工作方式。提前道歉,因为草率地把代码放在一起作为我的想法的试验场。
目前这段代码生成一个 JFrame,它带有一个名为 High Slot 的 JMenu,有 3 个子菜单,每个子菜单有 5 个选项。现在只有 rail 子菜单的前 2 个选项有一个动作侦听器。在它下面我有一个 JPanel,其中的图像会自动缩放到 JPanels 的大小。
问题是当我单击其中一个选项时,它没有像我认为的那样更新图片。我知道 Action 侦听器正在工作,因为我让它在触发时打印出一条语句。
我做错了什么?
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.imageio.*;
class Tests {
JMenu w, Rail, Cann, Miss;
JMenuItem r1,r3,r5,r7,r9,c1,c3,c5,c7,c9,m1,m3,m5,m7,m9;
private static BufferedImage h_empty, t1, t2, placeholder;
private boolean br1 = false, br3 = false, br5 = false, br7 = false, br9 = false, bc1 = false, bc3 = false, bc5 = false, bc7 = false, bc9 = false,
bm1 = false, bm3 = false, bm5 = false, bm7 = false, bm9 = false;
JFrame f= new JFrame("EveSim");
JPanel panel=new JPanel();
Tests(){
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel=new JPanel();
panel.setBounds(0,0,48,48);
panel.setBackground(Color.black);
try {
h_empty = ImageIO.read(new File("Icon_fit_high.png"));
} catch(IOException ex) {
System.out.println("Error: Image Failed to Load!");
}
try {
t1 = ImageIO.read(new File("index.png"));
} catch(IOException ex) {
System.out.println("Error: Image Failed to Load!");
}
try {
t2 = ImageIO.read(new File("index1.png"));
} catch(IOException ex) {
System.out.println("Error: Image Failed to Load!");
}
placeholder = h_empty;
ImageIcon imageIcon = new ImageIcon(fitimage(placeholder, panel.getWidth(), panel.getHeight()));
JLabel jl = new JLabel(imageIcon);
panel.add(jl);
JMenuBar mb=new JMenuBar();
w=new JMenu("High Slot");
Rail=new JMenu("Railguns");
Cann=new JMenu("Cannons");
Miss=new JMenu("Missiles");
r1=new JMenuItem("Tech 1");
r1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
Reset();
br1 = !br1;
System.out.println("rail-tech1");
placeholder = t1;
p_add();
}
});
r3=new JMenuItem("Tech 3");
r3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
Reset();
br3 = !br3;
System.out.println("rail-tech3");
placeholder =t2;
p_add();
}
});
r5=new JMenuItem("Tech 5");
r7=new JMenuItem("Tech 7");
r9=new JMenuItem("Tech 8");
c1=new JMenuItem("Tech 1");
c3=new JMenuItem("Tech 3");
c5=new JMenuItem("Tech 5");
c7=new JMenuItem("Tech 7");
c9=new JMenuItem("Tech 8");
m1=new JMenuItem("Tech 1");
m3=new JMenuItem("Tech 3");
m5=new JMenuItem("Tech 5");
m7=new JMenuItem("Tech 7");
m9=new JMenuItem("Tech 8");
Rail.add(r1); Rail.add(r3); Rail.add(r5); Rail.add(r7); Rail.add(r9);
Cann.add(c1); Cann.add(c3); Cann.add(c5); Cann.add(c7); Cann.add(c9);
Miss.add(m1); Miss.add(m3); Miss.add(m5); Miss.add(m7); Miss.add(m9);
w.add(Rail); w.add(Cann); w.add(Miss);
mb.add(w);
f.setJMenuBar(mb);
f.add(panel);
f.setSize(400,400);
f.setLayout(null);
f.setVisible(true);
}
private Image fitimage(Image img , int w , int h) {
BufferedImage resizedimage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = resizedimage.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(img, 0, 0,w,h,null);
g2.dispose();
return resizedimage;
}
private void p_add() {
panel.setBounds(0,0,48,48);
panel.setBackground(Color.black);
ImageIcon imageIcon = new ImageIcon(fitimage(placeholder, panel.getWidth(), panel.getHeight()));
JLabel jl = new JLabel(imageIcon);
panel.add(jl);
f.add(panel);
}
private void Reset() {
br1 = false;
br3 = false;
br5 = false;
br7 = false;
br9 = false;
bc1 = false;
bc3 = false;
bc5 = false;
bc7 = false;
bc9 = false;
bm1 = false;
bm3 = false;
bm5 = false;
bm7 = false;
bm9 = false;
}
public static void main(String args[]){
new Tests();
}
}
private void p_add() {
panel.setBounds(0,0,48,48);
panel.setBackground(Color.black);
ImageIcon imageIcon = new ImageIcon(fitimage(placeholder, panel.getWidth(), panel.getHeight()));
JLabel jl = new JLabel(imageIcon);
panel.add(jl);
f.add(panel);
}
问题是您一直在向框架添加组件,但由于 Swing 绘制逻辑,您看不到新添加的组件。
- 不要使用 setBounds()。 Swing 旨在与布局管理器一起使用。
- 不要继续创建新组件。您应该创建一个将
JLabel
添加到 class 的构造函数中的框架。然后在您的 ActionListener 中,您只需创建一个新的 ImageIcon
,然后使用 JLabel
的 setIcon(...)
方法来更新图像。
以上建议将需要重新设计您的应用程序。我建议您从 How to Use Combo Boxes.
的 Swing 教程部分中找到的 ComboBoxDemo
开始
是的,示例使用了组合框,但概念是相同的。在这两种情况下,您都使用 ActionListener 来更改图像。在演示中,ActionListener 被添加到组合框。在您的例子中,ActionListener 被添加到菜单项中。
我在使用 JMenu 时遇到问题,我怀疑这是因为我误解了 Jframe 在实时更新方面的工作方式。提前道歉,因为草率地把代码放在一起作为我的想法的试验场。
目前这段代码生成一个 JFrame,它带有一个名为 High Slot 的 JMenu,有 3 个子菜单,每个子菜单有 5 个选项。现在只有 rail 子菜单的前 2 个选项有一个动作侦听器。在它下面我有一个 JPanel,其中的图像会自动缩放到 JPanels 的大小。
问题是当我单击其中一个选项时,它没有像我认为的那样更新图片。我知道 Action 侦听器正在工作,因为我让它在触发时打印出一条语句。
我做错了什么?
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.imageio.*;
class Tests {
JMenu w, Rail, Cann, Miss;
JMenuItem r1,r3,r5,r7,r9,c1,c3,c5,c7,c9,m1,m3,m5,m7,m9;
private static BufferedImage h_empty, t1, t2, placeholder;
private boolean br1 = false, br3 = false, br5 = false, br7 = false, br9 = false, bc1 = false, bc3 = false, bc5 = false, bc7 = false, bc9 = false,
bm1 = false, bm3 = false, bm5 = false, bm7 = false, bm9 = false;
JFrame f= new JFrame("EveSim");
JPanel panel=new JPanel();
Tests(){
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel=new JPanel();
panel.setBounds(0,0,48,48);
panel.setBackground(Color.black);
try {
h_empty = ImageIO.read(new File("Icon_fit_high.png"));
} catch(IOException ex) {
System.out.println("Error: Image Failed to Load!");
}
try {
t1 = ImageIO.read(new File("index.png"));
} catch(IOException ex) {
System.out.println("Error: Image Failed to Load!");
}
try {
t2 = ImageIO.read(new File("index1.png"));
} catch(IOException ex) {
System.out.println("Error: Image Failed to Load!");
}
placeholder = h_empty;
ImageIcon imageIcon = new ImageIcon(fitimage(placeholder, panel.getWidth(), panel.getHeight()));
JLabel jl = new JLabel(imageIcon);
panel.add(jl);
JMenuBar mb=new JMenuBar();
w=new JMenu("High Slot");
Rail=new JMenu("Railguns");
Cann=new JMenu("Cannons");
Miss=new JMenu("Missiles");
r1=new JMenuItem("Tech 1");
r1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
Reset();
br1 = !br1;
System.out.println("rail-tech1");
placeholder = t1;
p_add();
}
});
r3=new JMenuItem("Tech 3");
r3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
Reset();
br3 = !br3;
System.out.println("rail-tech3");
placeholder =t2;
p_add();
}
});
r5=new JMenuItem("Tech 5");
r7=new JMenuItem("Tech 7");
r9=new JMenuItem("Tech 8");
c1=new JMenuItem("Tech 1");
c3=new JMenuItem("Tech 3");
c5=new JMenuItem("Tech 5");
c7=new JMenuItem("Tech 7");
c9=new JMenuItem("Tech 8");
m1=new JMenuItem("Tech 1");
m3=new JMenuItem("Tech 3");
m5=new JMenuItem("Tech 5");
m7=new JMenuItem("Tech 7");
m9=new JMenuItem("Tech 8");
Rail.add(r1); Rail.add(r3); Rail.add(r5); Rail.add(r7); Rail.add(r9);
Cann.add(c1); Cann.add(c3); Cann.add(c5); Cann.add(c7); Cann.add(c9);
Miss.add(m1); Miss.add(m3); Miss.add(m5); Miss.add(m7); Miss.add(m9);
w.add(Rail); w.add(Cann); w.add(Miss);
mb.add(w);
f.setJMenuBar(mb);
f.add(panel);
f.setSize(400,400);
f.setLayout(null);
f.setVisible(true);
}
private Image fitimage(Image img , int w , int h) {
BufferedImage resizedimage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = resizedimage.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(img, 0, 0,w,h,null);
g2.dispose();
return resizedimage;
}
private void p_add() {
panel.setBounds(0,0,48,48);
panel.setBackground(Color.black);
ImageIcon imageIcon = new ImageIcon(fitimage(placeholder, panel.getWidth(), panel.getHeight()));
JLabel jl = new JLabel(imageIcon);
panel.add(jl);
f.add(panel);
}
private void Reset() {
br1 = false;
br3 = false;
br5 = false;
br7 = false;
br9 = false;
bc1 = false;
bc3 = false;
bc5 = false;
bc7 = false;
bc9 = false;
bm1 = false;
bm3 = false;
bm5 = false;
bm7 = false;
bm9 = false;
}
public static void main(String args[]){
new Tests();
}
}
private void p_add() {
panel.setBounds(0,0,48,48);
panel.setBackground(Color.black);
ImageIcon imageIcon = new ImageIcon(fitimage(placeholder, panel.getWidth(), panel.getHeight()));
JLabel jl = new JLabel(imageIcon);
panel.add(jl);
f.add(panel);
}
问题是您一直在向框架添加组件,但由于 Swing 绘制逻辑,您看不到新添加的组件。
- 不要使用 setBounds()。 Swing 旨在与布局管理器一起使用。
- 不要继续创建新组件。您应该创建一个将
JLabel
添加到 class 的构造函数中的框架。然后在您的 ActionListener 中,您只需创建一个新的ImageIcon
,然后使用JLabel
的setIcon(...)
方法来更新图像。
以上建议将需要重新设计您的应用程序。我建议您从 How to Use Combo Boxes.
的 Swing 教程部分中找到的ComboBoxDemo
开始
是的,示例使用了组合框,但概念是相同的。在这两种情况下,您都使用 ActionListener 来更改图像。在演示中,ActionListener 被添加到组合框。在您的例子中,ActionListener 被添加到菜单项中。