首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择JPanel时更改JMenuItem中的图像

选择JPanel时更改JMenuItem中的图像
EN

Stack Overflow用户
提问于 2020-10-19 20:20:56
回答 1查看 63关注 0票数 0

我在JMenu上遇到了麻烦,我怀疑这是因为我误解了Jframe在实时更新方面的工作方式。事先为草率地把代码放在一起表示歉意,因为它是我的想法的测试场所。

目前,这段代码产生了一个JFrame,它有一个名为JMenu的高槽,有3个子菜单,每个子菜单都有5个选项。目前,只有铁轨子菜单的前两个选项有一个动作监听器。在它下面我有一个JPanel,它有一个自动缩放到JPanels大小的图像。

问题是,当我点击其中一个选项时,它不会像我认为应该更新的那样更新图片。我知道Action正在工作,因为每当它启动时,我就让它打印出一条语句。

我做错了什么?

代码语言:javascript
复制
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();
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-19 20:41:49

代码语言:javascript
复制
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);
}

问题是,您一直在框架中添加组件,并且由于摆动绘画逻辑,您看不到新添加的组件。

  1. 不要使用setBounds()。Swing被设计用于布局管理器。
  2. 不要一直在创建新组件。应该在类的构造函数中将JLabel添加到框架中。然后在ActionListener中创建一个新的ImageIcon,然后使用JLabelsetIcon(...)方法更新图像。

以上建议将需要重新设计您的申请。我建议您从Swing教程中关于ComboBoxDemo的部分中找到的如何使用组合框开始。

是的,该示例使用组合框,但概念是相同的。在这两种情况下,您都使用ActionListener来更改图像。在演示中,ActionListener被添加到组合框中。在您的示例中,ActionListener被添加到菜单项中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64434616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档