-1

だから最近、私はいくつかの Java を学び始めました。他の言語 (主に PHP や HTML などの Web 指向のもの) の経験があります。そこで、単純なランチャー/デスクトップ オーバーレイを好む小さなプロジェクトから始めました。に基づいてJPanel、ここで問題が発生し始めました。

ピン留めできるアプリケーションを使用して、Windows 7 のタスク バーのようなものを実現したいと考えていました。そこで、exeファイルからJavaに「抽出」アイコンを探す方法を探し始めました。このサイトでいくつかのトピックを見つけました。答えのほとんどは、このサイトへの URLです。

これらはすべて機能しますが、問題は、これらの関数 ( などgetSystemIcon) を呼び出すと、上のすべてのパネル (親) が消えることです。を再描画することですべてを元に戻すことができますが、それに対する別の解決策はありますか、それとも何か間違っていますか?

コード:

import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Graphics;
import java.io.File;
import javax.swing.Icon;
import javax.swing.JPanel;
import javax.swing.filechooser.FileSystemView;


public class Startbar extends JPanel{


private static final long serialVersionUID = 1L;
Config cfg = new Config();
public Startbar() {
    
    
    setPreferredSize(new Dimension(cfg.Resx,35));
    setBounds(0,1015,cfg.Resx,35);
    setVisible(true);
   
    this.setLayout(null);
    StartbarClock clock = new StartbarClock();
    clock.setBounds(cfg.Resx-135,0, 135, 35);
    this.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    
    
    add(clock);
    AddPins();
}
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.black);
    g.fillRect(0, 0, cfg.Resx, 35);
    repaint();
}
public void AddPins(){
    String filename = "C:/Program Files (x86)/Skype/Phone/Skype.exe";
    
    Icon ico = FileSystemView.getFileSystemView().getSystemIcon(new File(filename));
    System.out.println(ico.getIconHeight());
        
    }
}

編集:関数に1秒のタイムアウトを追加した後、すべてが正常に機能します... wtf?いくつかのコード:

public class Startbar extends JPanel{
        
        ActionListener listener = new ActionListener(){
              public void actionPerformed(ActionEvent event){
                pin();
              }
        };
        
        Timer timer = new Timer(1000 ,listener);
        
        private static final long serialVersionUID = 1L;
        Config cfg = new Config();
        public Startbar() {
            
            
            setPreferredSize(new Dimension(cfg.Resx,35));
            setBounds(0,1015,cfg.Resx,35);
            setVisible(true);
            setBackground(Color.black);
            this.setLayout(null);
            StartbarClock clock = new StartbarClock();
            
            add(clock);
            
            timer.start();
            //pin();
        }
        
        public void pin(){
            String filename = "C:/Program Files (x86)/Skype/Phone/Skype.exe";
            FileSystemView view = FileSystemView.getFileSystemView();    
            Icon icon = view.getSystemIcon(new File(filename));
            System.out.println(icon.getIconHeight());
            timer.stop();
        }
    }
4

2 に答える 2

3

実行しようとしていることについては、StartBarの背景を黒に設定してください。そうすれば、paintComponetを上書きする必要はありません。

StartBarの境界を設定せず、代わりにset/getPreferredSizeを使用してください。これにより、親コンテナがコンポーネントの最適なサイズを計算できるようになります(これにより問題が説明される可能性があります)

レイアウトマネージャーの使用を真剣に検討する必要があります。

2つの子パネル(コンテンツとタスク)があります。すべてのアプリケーションアイコンをコンテンツに配置します。おそらくフローレイアウトとタスクとしての時計を使用します。これも、おそらくフローレイアウトを使用します。次に、グリッドバッグレイアウトまたはボーダーレイアウトのいずれかを使用して、それらをタスクバーパネルに追加します。

それはそうではないように見えるかもしれませんが、長期的にはあなたの人生をとても楽にしてくれるでしょう

アップデート

では、なぜ私のものが機能するのか説明してください。

そして、見てください。paintComponentをオーバーライドしたり、見えたところで再ペイントしたりする必要はありません。

public class TaskBarPane extends javax.swing.JPanel {

    /**
     * Creates new form TaskBarPane
     */
    public TaskBarPane() {
        
        initComponents();
        
        setPreferredSize(new Dimension(800, 24));
        
        pinTask(new File("C:/Program Files/BabyCounter/BabyCounter x64.exe"));
        
    }
    
    protected void pinTask(File task) {
        
        pnlContent.add(new TaskPane(task));
        
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        pnlContent = new javax.swing.JPanel();
        pnlClock = new test.ClockPane();

        setBackground(new java.awt.Color(0, 0, 0));
        setLayout(new java.awt.BorderLayout());

        pnlContent.setOpaque(false);
        java.awt.FlowLayout flowLayout1 = new java.awt.FlowLayout(java.awt.FlowLayout.LEFT);
        flowLayout1.setAlignOnBaseline(true);
        pnlContent.setLayout(flowLayout1);
        add(pnlContent, java.awt.BorderLayout.CENTER);

        pnlClock.setOpaque(false);
        add(pnlClock, java.awt.BorderLayout.EAST);
    }// </editor-fold>
    // Variables declaration - do not modify
    private test.ClockPane pnlClock;
    private javax.swing.JPanel pnlContent;
    // End of variables declaration
}

..

public class ClockPane extends javax.swing.JPanel {

    /**
     * Creates new form ClockPane
     */
    public ClockPane() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jLabel1 = new javax.swing.JLabel();

        setLayout(new java.awt.GridBagLayout());

        jLabel1.setForeground(new java.awt.Color(255, 255, 255));
        jLabel1.setText("Hello World");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 100;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(8, 8, 8, 8);
        add(jLabel1, gridBagConstraints);
    }// </editor-fold>
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    // End of variables declaration
}

..

public class TaskPane extends javax.swing.JPanel {

    /**
     * Creates new form TaskPane
     */
    public TaskPane() {
        initComponents();
    }

    public TaskPane(File task) {

        this();

        Icon ico = FileSystemView.getFileSystemView().getSystemIcon(task);
        lblIcon.setIcon(ico);

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        lblIcon = new javax.swing.JLabel();

        setOpaque(false);
        setLayout(new java.awt.GridBagLayout());

        lblIcon.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lblIcon.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        lblIcon.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        add(lblIcon, new java.awt.GridBagConstraints());
    }// </editor-fold>
    // Variables declaration - do not modify
    private javax.swing.JLabel lblIcon;
    // End of variables declaration
}

..。

public class TestFrame extends javax.swing.JFrame {

    /**
     * Creates new form TestFrame
     */
    public TestFrame() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        pnlTaskBar = new test.TaskBarPane();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(pnlTaskBar, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TestFrame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private test.TaskBarPane pnlTaskBar;
    // End of variables declaration
}

組み立てるのに10分かかりました(11週齢の娘に餌をやらなければなりませんでした、ごめんなさい)

于 2012-07-13T10:52:04.987 に答える
0

System.out.println("inRepaint") を paintComponent メソッドに追加し、コードを実行しました...

16
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
inRepaint
...

強制終了する前に、CPU 使用率が 85% まで上昇しました。

取り出したとき、1%に戻る前に約7%のCPUでウィンドウのサイズを変更したため、4〜5になりました

それで、ええ、あなたのコードは壊れました。

于 2012-07-13T12:18:54.727 に答える