paintComponent ведет себя странно [дубликат]

Я бы сделал так:

const str = "fsfs blabla Honda t Asus";
const regex = /([A-Z]\w+)/g;
const result = [];
let m;
while ((m = regex.exec(str)) !== null) result.push(m[1]);
$('#result').html(JSON.stringify(result));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="result"></p>

16
задан John 17 June 2012 в 09:35
поделиться

4 ответа

У меня также была такая же проблема, но я нашел решение. Просто создайте объект jframe сверху и вызовите методы jframe внизу, как jf.pack(), jf.setVisible(), jf.setSize(), jf.setDefaultCloseOpetion() должны быть в нижней части всех пользовательских интерфейсов, добавленных в этот фрейм, вы найдете он отлично работает.

0
ответ дан alamoot 25 August 2018 в 11:34
поделиться

Если вы хотите «обновить» JPanel, тогда вы должны вызвать repaint (), который вызовет ваш paintComponent (). Это должно устранить вашу проблему:

public void setImage(BufferedImage bi)
{
    image = bi;
    EventQueue.invokeLater(new Runnable()
    {
        public void run()
        {
            repaint();
        }
    });
}

Хорошая практика обновления и изменения GUI с помощью EDT. Heres больше информации об EDT, если вам интересно:

Как работает поток отправки событий?

repaint не требуется вызванный из EDT. Если вы меняете GUI, например, устанавливаете текст в JLabel, он должен быть внутри EDT. Heres больше информации о том, что можно назвать вне EDT (любезно предоставлено nIcE cOw):

Безопасно использовать Component.repaint () вне EDT?

7
ответ дан Community 25 August 2018 в 11:34
поделиться

Взгляните на docs для JPanel.add(), который он наследует от java.awt.Container:

Добавляет указанный компонент в конец этого контейнера. Это удобный метод для addImpl (java.awt.Component, java.lang.Object, int). Этот метод изменяет информацию, связанную с компоновкой, и, следовательно, делает недействительной иерархию компонентов. Если контейнер уже был отображен, иерархия должна быть подтверждена после этого, чтобы отобразить добавленный компонент.

Акцент добавлен.

Поэтому, если вы измените Контейнер после , он уже отображается, вы должны вызывать validate(), чтобы он отображался. Просто вызвать repaint() недостаточно. Возможно, вы заметили, что также работает вызов setVisible(true); это потому, что он называет validate() внутренне .

7
ответ дан Nateowami 25 August 2018 в 11:34
поделиться

У меня была та же проблема и исправлена ​​ее вызовом setVisible (true); JFrame I.

Пример: если ваш JFrame не обновляется после использования:

jframe.setContentPane(new MyContentPane());

исправить его с помощью:

jframe.setContentPane(new MyContentPane());
jframe.setVisible(true);

Я знаю что это звучит глупо, даже если ваш JFrame уже виден, но это единственный способ, который я нашел до сих пор, чтобы исправить эту проблему (предложенное выше решение не сработало для меня).

Вот полный пример. Запустите его, а затем раскомментируйте «f.setVisible (true)»; инструкции в классах Panel1 и Panel2, и вы увидите разницу. Не забывайте импортировать (Ctrl + Shift + O для автоматического импорта).

Основной класс:

public class Main {
    private static JFrame f;
    public static void main(String[] args) {
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new Panel1(f));
        f.pack();    
        f.setVisible(true);
    }
}

Класс Panel1:

public class Panel1 extends JPanel{
    private JFrame f;
    public Panel1(JFrame frame) {
        f = frame;
        this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
        JButton b = new JButton("Panel 1");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                f.setContentPane(new Panel2(f));
                // Uncomment the instruction below to fix GUI "update-on-resize-only" problem
                //f.setVisible(true);
            }
        });
        add(b);
    }
}

Класс Panel2:

public class Panel2 extends JPanel{
    private JFrame f;
    public Panel2(JFrame frame) {
        f = frame;
        this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
        JButton b = new JButton("Panel 2");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                f.setContentPane(new Panel1(f));
                // Uncomment the instruction below to fix GUI "update-on-resize-only" problem
                //f.setVisible(true);
            }
        });
        add(b);
    }
}

Надеюсь, что это помогает.

С уважением.

2
ответ дан user2154283 25 August 2018 в 11:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: