【问题标题】:Dynamically changing Icons of tabs in Java JTabbedPane在 Java JTabbedPane 中动态更改选项卡的图标
【发布时间】:2014-08-05 15:56:13
【问题描述】:

更新*** 如何在 JTabbedPane 中动态更改选项卡的图标? 这是代码。我需要图标从初始处理最终更改 这段代码只是初始-最终

代码:

package tabs;

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.JButton;


public class ChangeIconTest {

    private JFrame frame;
    private JTabbedPane tabbedPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ChangeIconTest window = new ChangeIconTest();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public ChangeIconTest() {
        initialize();
        addtabs();

    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        tabbedPane.setBounds(0, 0, 434, 262);
        frame.getContentPane().add(tabbedPane);


    }

    private void addtabs(){
        tabbedPane.insertTab("tab name", displayInitial(), addButton(), null, 0);
        tabbedPane.setSelectedIndex(0);

    }

    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = ChangeIconTest.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

    public Icon displayInitial(){
        ImageIcon initialIcon = createImageIcon("first.gif");
        return initialIcon;
    }
    public Icon displayMid(){


        ImageIcon midIcon = createImageIcon("second.gif");
        return midIcon;

    }
    public Icon displayFinal(){

        ImageIcon finalIcon2 = createImageIcon("third.jpg");
        return finalIcon2;
    }


    public Component addButton(){
        JButton jb = new JButton("The Big Button to change the Icon");
        jb.addActionListener(new ChangeTabListener());
        return jb;
    }

    class ChangeTabListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            tabbedPane.setIconAt(0, displayMid());
            tabbedPane.revalidate();
            tabbedPane.repaint();
            tabbedPane.setIconAt(0, displayFinal());
            tabbedPane.revalidate();
            tabbedPane.repaint();
        }



    }
}

那么我应该添加或修改什么?谢谢!

【问题讨论】:

    标签: java swing icons jtabbedpane


    【解决方案1】:

    你为什么使用 Thread.sleep()?您可能导致 Event Dispatch Thread 进入休眠状态,这意味着 GUI 无法自行重绘。

    如果您想在一段时间内动态更改图标,请使用Swing Timer 来安排图标的更改。

    如果您需要更多帮助,请更新您的问题并发布正确的 SSCCE 来说明问题。

    【讨论】:

    • Thread.sleep 正在工作,因为它已更改为最终图标。刚刚发布了一个可运行的代码
    • @PhilipMorris Thread.sleep is working because it changed to the final Icon. 不,它不起作用。是的,线程将休眠 2 秒并且什么也不做。然后您尝试更改为临时图标,然后更改为最终图标,但代码执行速度太快,因此您只能看到最终图标。即使您在设置临时图标和最终图标之间添加 Thread.sleep() ,您也不会看到临时图标,因为 GUI 在重新绘制图标之前会休眠。然后当它醒来时,它会立即绘制最终图标。我已经给你解决方案了。
    【解决方案2】:

    尝试添加这个

    tabs.revalidate();
    tabs.repaint();
    

    或者

    tabs.getParent().revalidate();
    tabs.getParent().repaint();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-09
      • 2014-06-19
      • 1970-01-01
      • 2013-11-28
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多