【问题标题】:JSpinner's JButton to ImageIconJSpinner 的 JButton 到 ImageIcon
【发布时间】:2013-05-14 16:06:14
【问题描述】:

尝试将JSpinnerJButton 控制器替换为ImageIcon。但由于某种原因,它不听任何mouseclicks(installButtonListeners()BasicSpinnerUI 似乎添加MouseListener)。任何想法为什么以及如何解决?

public class SpinnerIconBtn extends JFrame {

    public SpinnerIconBtn(){
        JSpinner spinner = new JSpinner();
        spinner.setUI(new JSpinnerArrow());

        this.add(spinner);
        this.pack();
        this.setVisible(true);
    }

    class JSpinnerArrow extends BasicSpinnerUI {

        @Override
        protected Component createNextButton() {
            Component c = createArrowButton(SwingConstants.NORTH);
            c.setName("Spinner.nextButton");
            installNextButtonListeners(c);
            return c;
        }

        @Override
        protected Component createPreviousButton() {
            Component c = createArrowButton(SwingConstants.SOUTH);
            c.setName("Spinner.previousButton");
            installPreviousButtonListeners(c);
            return c;
        }

        private Component createArrowButton(int direction) {
            String path = "/Users/tst.png";
            JLabel icon = new JLabel(new ImageIcon(path));
            return icon;
        }
    }

    public static void main(String[] args) {
        new SpinnerIconBtn();
    }
}

【问题讨论】:

    标签: java swing jbutton imageicon jspinner


    【解决方案1】:
    • 不要改变Icon,使用paintIcon()

    • 如果箭头按钮被移动的图标太大,请更改 LayoutManager

    .

    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    
    class Testing {
        //int counter = 0;//proper setting
    
        int counter = 7195;//testing hours 'tick over' correctly
        JSpinner spinner = new JSpinner();
        JTextField editor = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();
        java.text.DecimalFormat df = new java.text.DecimalFormat("00");
    
        public void buildGUI() {
            spinner.setUI(new EndlessHoursUI());
            JFrame f = new JFrame();
            f.getContentPane().add(spinner);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    
        class EndlessHoursUI extends javax.swing.plaf.basic.BasicSpinnerUI {
    
            public EndlessHoursUI() {
                setTime();
            }
    
            @Override
            protected void installNextButtonListeners(Component c) {
            }// do nothing
    
            @Override
            protected void installPreviousButtonListeners(Component c) {
            }// do nothing
    
            @Override
            protected Component createNextButton() {
                JButton btnNext = (JButton) super.createNextButton();
                btnNext.addActionListener(new ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        changeSpinner(1);
                    }
                });
                return btnNext;
            }
    
            @Override
            protected Component createPreviousButton() {
                JButton btnPrevious = (JButton) super.createPreviousButton();
                btnPrevious.addActionListener(new ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        changeSpinner(-1);
                    }
                });
                return btnPrevious;
            }
        }
    
        public void changeSpinner(int amount) {
            if (counter > 0 || amount > 0) {
                counter += amount;
                setTime();
            }
        }
    
        public void setTime() {
            int hours = counter / 3600;
            int mins = (counter / 60) % 60;
            int secs = counter % 60;
            String time = df.format(hours) + ":" + df.format(mins) + ":" + df.format(secs);
            editor.setText(time);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new Testing().buildGUI();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      没有设法用答案解决它。通过删除所有没有箭头的按钮来调整按钮,然后我将箭头一起移动:

      private Component createArrowButton(int direction) {
      
              JButton b = new BasicArrowButton(direction){
      
                  private static final long serialVersionUID = 1L;
      
                  @Override
                  public void paintTriangle(Graphics g, int x, int y, int size,
                          int direction, boolean isEnabled) {
      
      
                      if(direction == NORTH){
                          y +=3;
                      }
                      else if(direction == SOUTH){
                          y -=3;
                      }
      
                      Color shadow = UIManager.getColor("controlShadow");                 
                      Color darkShadow = UIManager.getColor("controlDkShadow");
                      Color highlight = UIManager.getColor("controlLtHighlight");
      
                      Color oldColor = g.getColor();
                      int mid, i, j;
      
                      j = 0;
                      size = Math.max(size, 2);
                      mid = (size / 2) - 1;
      
                      g.translate(x, y);
                      if (isEnabled)
                          g.setColor(darkShadow);
                      else
                          g.setColor(shadow);
      
                      switch (direction) {
                      case NORTH:
      
                          for (i = 0; i < size; i++) {
                              g.drawLine(mid - i, i, mid + i, i);
                          }
                          if (!isEnabled) {
                              g.setColor(highlight);
                              g.drawLine(mid - i + 2, i, mid + i, i);
                          }
                          break;
                      case SOUTH:
                          if (!isEnabled) {
                              g.translate(1, 1);
                              g.setColor(highlight);
                              for (i = size - 1; i >= 0; i--) {
                                  g.drawLine(mid - i, j, mid + i, j);
                                  j++;
                              }
                              g.translate(-1, -1);
                              g.setColor(shadow);
                          }
      
                          j = 0;
                          for (i = size - 1; i >= 0; i--) {
                              g.drawLine(mid - i, j, mid + i, j);
                              j++;
                          }
                          break;
                      case WEST:
                          for (i = 0; i < size; i++) {
                              g.drawLine(i, mid - i, i, mid + i);
                          }
                          if (!isEnabled) {
                              g.setColor(highlight);
                              g.drawLine(i, mid - i + 2, i, mid + i);
                          }
                          break;
                      case EAST:
                          if (!isEnabled) {
                              g.translate(1, 1);
                              g.setColor(highlight);
                              for (i = size - 1; i >= 0; i--) {
                                  g.drawLine(j, mid - i, j, mid + i);
                                  j++;
                              }
                              g.translate(-1, -1);
                              g.setColor(shadow);
                          }
      
                          j = 0;
                          for (i = size - 1; i >= 0; i--) {
                              g.drawLine(j, mid - i, j, mid + i);
                              j++;
                          }
                          break;
                      }
                      g.translate(-x, -y);
                      g.setColor(oldColor);
                  }
              };
              b.setBorder(BorderFactory.createEmptyBorder());
              //removes content area
              b.setContentAreaFilled(false);
              b.setInheritsPopupMenu(true);
              b.setOpaque(false);
              b.setBackground(color);
      
              return b;
          }
      

      【讨论】:

        【解决方案3】:

        installNextButtonListeners()installPreviousButtonListeners() 调用如下方法:

        private void installButtonListeners(Component c,
                                            ArrowButtonHandler handler) {
            if (c instanceof JButton) {
                ((JButton)c).addActionListener(handler);
            }
            c.addMouseListener(handler);
        }
        

        instanceof 检查ArrowButtonHandler 不会作为ActionListener 附加到处理旋转的JLabel 的原因。

        您可以使用JButton 的子类而不是JLabel

        【讨论】:

          猜你喜欢
          • 2015-07-25
          • 2013-12-21
          • 2012-06-08
          • 2019-03-12
          • 2012-10-24
          • 2014-11-30
          • 2011-02-20
          • 1970-01-01
          • 2016-08-25
          相关资源
          最近更新 更多