首页 文章

在java swing中移动组件

提问于
浏览
1

我制作了一个swing应用程序,其中我在Panel上有一个网格布局,现在我在该面板上有8个自定义按钮,左右两个按钮用于导航 .

现在我的问题是当我点击导航按钮时我想以滑动方式移动按钮,为此我设置每个按钮位置,

但是Jpanel没有刷新自己,所以它不可见,如果我添加对话框并单击确定然后它看起来像按钮正在移动 .

我怎么能这样做,我使用revalidate(),并重绘()但它不起作用 .

在下一个按钮点击执行的功能

java.net.URL imageURL = cldr.getResource("images/" +2 + ".png");
                    ImageIcon aceOfDiamonds = new ImageIcon(imageURL);
                    button = new MyButton("ABC", aceOfDiamonds, color[3]);
                    Component buttons[] = jPanel1.getComponents();
                    ArrayList<MyButton> buttons1=new ArrayList<MyButton>();
                    for(int i=0;i<buttons.length;i++)
                    {
                        buttons1.add((MyButton) buttons[i]);
                    }
                    Point p=buttons[0].getLocation();
                    Point p1=buttons[1].getLocation();
                    int dis=p1.x-p.x;
                    System.out.println("Distance-->"+dis);
                    button.setLocation(buttons[buttons.length-1].getLocation().x+dis,buttons[0].getLocation().y);
                    jPanel1.add(button);
                    buttons1.add(button);
                    for(int i=0;i<dis;i++)
                    {
                        for(int btn=0;btn<buttons1.size();btn++)
                        {
                            int currX=buttons1.get(btn).getLocation().x;
                            currX--;
                            buttons1.get(btn).setLocation(currX, buttons1.get(btn).getLocation().y);
                        }
                        try
                        {
                            Thread.sleep(500);
                        }
                        catch (InterruptedException ex)
                        {
                            Logger.getLogger(TestPanel.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        //JOptionPane.showMessageDialog(null,"fds");
                        jPanel1.validate();jPanel1.repaint();
                       }

![在此处输入图像说明] [1]

1 回答

  • 8

    不要设置位置 . 从容器中删除所有按钮并按新顺序重新添加,然后调用 revalidate()repaint() .

    Edit
    如果要将按钮滑动滑动,请考虑将它们放在JScrollPane中,没有滚动条,然后以编程方式滚动按钮 . 我同意你不应该在EDT上使用 Thread.sleep(...) 而是使用Swing Timer .

    Edit 2
    例如:

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    public class SlideButtons extends JPanel {
       private static final int PREF_W = 600;
       private static final int PREF_H = 200;
       private static final int MAX_BUTTONS = 100;
       private static final int SCROLL_TIMER_DELAY = 10;
       public static final int SCROLL_DELTA = 3;
       private JPanel btnPanel = new JPanel(new GridLayout(1, 0, 10, 0));
       private JScrollPane scrollPane = new JScrollPane(btnPanel);
       private JButton scrollLeftBtn = new JButton("<");
       private JButton scrollRightBtn = new JButton(">");
       private BoundedRangeModel horizontalModel = scrollPane.getHorizontalScrollBar().getModel();
       private Timer scrollTimer = new Timer(SCROLL_TIMER_DELAY, new ScrollTimerListener());
       public String btnText = "";
    
       public SlideButtons() {
          scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
          scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
          for (int i = 0; i < MAX_BUTTONS; i++) {
             String text = String.format("Button %03d", (i + 1));
             JButton btn = new JButton(text);
             btnPanel.add(btn);
          }
          ScrollingBtnListener scrollingBtnListener = new ScrollingBtnListener();
          scrollLeftBtn.addChangeListener(scrollingBtnListener);
          scrollRightBtn.addChangeListener(scrollingBtnListener);
    
          JPanel northPanel = new JPanel(new BorderLayout());
          northPanel.add(scrollLeftBtn, BorderLayout.LINE_START);
          northPanel.add(scrollPane, BorderLayout.CENTER);
          northPanel.add(scrollRightBtn, BorderLayout.LINE_END);
    
          setLayout(new BorderLayout());
          add(northPanel, BorderLayout.PAGE_START);
       }
    
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_W, PREF_H);
       }
    
       private class ScrollingBtnListener implements ChangeListener {
          @Override
          public void stateChanged(ChangeEvent e) {
             JButton btn = (JButton)e.getSource();
             ButtonModel model = btn.getModel();
             //actionCommand  = model.getActionCommand();
             btnText = btn.getText();
             if (model.isPressed() && model.isEnabled()) {
                scrollTimer.start();
             } else {
                scrollTimer.stop();
             }
          }
       }
    
       private class ScrollTimerListener implements ActionListener {
          @Override
          public void actionPerformed(ActionEvent e) {
             if (btnText == null) {
                return;
             }
             int max = horizontalModel.getMaximum();
             int min = horizontalModel.getMinimum();
             int value = horizontalModel.getValue();
    
             if (btnText.equals(">")) {
                if (value <= max) {
                   value += SCROLL_DELTA;
                } else {
                   value = max;
                }
             } else if (btnText.equals("<")) {
                if (value >= min) {
                   value -= SCROLL_DELTA;
                } else {
                   value = min;
                }
             }
             horizontalModel.setValue(value);
          }
       }
    
       private static void createAndShowGui() {
          SlideButtons mainPanel = new SlideButtons();
    
          JFrame frame = new JFrame("SlideButtons");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    

相关问题