2017-10-04 113 views
0

我有一個框架,其中包含一個按鈕和一個文本字段。我寫了一個傳輸處理程序,所以我可以放入文件。但是,當我在框架上設置傳輸處理程序時,只有按鈕接受放置。swing - setTransferHandler整個框架

我有的解決方法是爲面板的所有組件設置傳輸處理程序。

什麼是正確的方法來做到這一點?

JPanel panel = new JPanel(); 
    flowPanel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 

    JTextField textField = new JTextField(); 
    textField.setMaximumSize(new Dimension(4000, 30)); 

    JButton button = new JButton("Button"); 
    button.setHorizontalAlignment(SwingConstants.LEFT); 


    TransferHandler newHandler = new TransferHandler() { 
     public boolean canImport(TransferHandler.TransferSupport info) { 
      return true; 
     } 
    }; 

    // downs't work - only the button accepts a drop 
    panel.setTransferHandler(newHandler); 

    // A workaround - does what I want 
    textField.setTransferHandler(newHandler); 
    button.setTransferHandler(newHandler); 

    panel.add(button); 
    panel.add(textField); 
+0

'解決方法我已經是設置傳輸處理程序panel.'的所有組件 - 似乎是合理的我。您無法將KeyListener添加到面板並使其適用於面板上的所有文本字段。 – camickr

+0

那麼,在我的情況下,我只有一個文本字段,無論如何,我的處理程序知道該怎麼做......我將相同的處理程序添加到所有組件,並且它工作正常。 如果它不適用於JFrame。爲什麼可以添加它? – ModdyFire

回答

1

here的方法getAllChildrenOfClass

在你的情況,你應該使用此方法如下

JFrame myFrame = ...; // your jframe 

List<JComponent> comps = getAllChildrenOfClass(myFrame.getRootPane(), JComponent.class); 
// you can also use myFrame.getContentPane() instead of myFrame.getRootPane() 
for (JComponent c : comps) { 
    c.setTransferHanler(newHandler); 
} 
+0

謝謝,看起來它會工作(現在還沒有時間檢查),但仍然感覺像一個黑客, – ModdyFire

-1


以下組件的支持下降開箱。如果您正在使用這些組件之一,那麼您的工作就完成了。

  • JEditorPane
  • JFormattedTextField
  • JPasswordField
  • JTextArea
  • JTextField
  • JTextPane
  • JColorChooser

所以我想你會需要使用JComponent#setTransferHandler(null)刪除內置TransferHandler

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TextComponentTransferHandlerTest { 
    public JComponent makeUI() { 
    JPanel panel = new JPanel(); 

    JTextField textField = new JTextField("BasicTextUI$TextTransferHandler"); 
    System.out.println(textField.getTransferHandler()); 

    JTextField textField2 = new JTextField("setTransferHandler(null)"); 
    textField2.setTransferHandler(null); //reset default 

    JButton button = new JButton("Button"); 
    button.setHorizontalAlignment(SwingConstants.LEFT); 

    TransferHandler newHandler = new TransferHandler() { 
     @Override public boolean canImport(TransferSupport info) { 
     return true; 
     } 
    }; 
    panel.setTransferHandler(newHandler); 

    // A workaround - does what I want 
    // textField.setTransferHandler(newHandler); 
    // button.setTransferHandler(newHandler); 

    panel.add(button); 
    panel.add(textField); 
    panel.add(textField2); 

    return panel; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new TextComponentTransferHandlerTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
}