一个看起来像JTextArea的JTextPane

时间:2013-10-18 17:53:10

标签: java swing look-and-feel nimbus

由于我们开始走错了路,我再次问,先前的问题已删除。请检查一下,JTextPane的边框与JTextArea的边框不同,默认情况下不是这样:

所以我需要一个看起来与JTextArea完全相同的JTextPane。

我将JTextPane的边框设置为新的JTextArea()。getBorder();.看起来它应该没有被正确绘制...我该如何解决?

我在这里使用Nimbus,如果它有任何帮助......

THE SSCCE:

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.UIManager.LookAndFeelInfo;


public class Main
{
public static void main(String[] args)
{
    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels())
    {
        if ("Nimbus".equals(info.getName()))
        {
            try
            {
                UIManager.setLookAndFeel(info.getClassName());
            }
            catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e)

            {
                System.out.println("No Nimbus!");
            }

            break;
        }
    }

    JFrame a = new JFrame("Test");
    a.setSize(200, 400);
    a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    a.getContentPane().setLayout(new BoxLayout(a.getContentPane(), BoxLayout.Y_AXIS));

    JTextPane[] b = new JTextPane[5];

    for (int i = 0; i < 5; i++)
    {
        b[i] = new JTextPane();
        b[i].setBorder(new JTextArea().getBorder());
        b[i].setText(Integer.toString(i));
        a.getContentPane().add(b[i]);
    }

    a.setVisible(true);
}
}

我已将边框设置为与JTextArea上的边框相同,但焦点未正确绘制或移动。如果你注释掉那一行,就没有任何边界。

1 个答案:

答案 0 :(得分:3)

如果你添加一个强制重绘的Focus Listener,那么奇怪的行为就会消失。

示例:

for (int i = 0; i < 5; i++) {
    final JTextPane b = new JTextPane();
    b.setBorder(new JTextArea().getBorder());
    b.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent arg0) {
            b.repaint();
        }

        @Override
        public void focusLost(FocusEvent arg0) {
            b.repaint();
        }

    });
    b.setText(Integer.toString(i));
    a.getContentPane().add(b);
}

这似乎是一个黑客修复,但我不确定为什么会发生这种情况。