Как читать данные только один раз в Java Swing? - PullRequest
0 голосов
/ 25 июля 2010

Я новичок в Swing.Я хочу написать программу, которая читает файл и рисует что-то в зависимости от данных, прочитанных из файла.

Я проверил учебники, и они вызывают методы рисования в paint ().Поэтому я добавил код для чтения файла тоже в методе paint ().Однако я заметил, что метод paint () может вызываться несколько раз.Таким образом, файл будет читаться каждый раз, когда вызывается метод paint ().

Я хочу прочитать файл только один раз.Если я прочитал файл в методе main (), как мне получить доступ к графическому объекту?Или есть какой-то другой подход для решения этой проблемы?

import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JPanel {

    public void paint(Graphics g) {
    // Code to read a file
    // Code to draw something depending on the data read from the file
    }


    public static void main(String[] args) {

        JFrame frame = new JFrame("Java 2D Skeleton");
        frame.add(new Test());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(280, 240);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Ответы [ 3 ]

2 голосов
/ 25 июля 2010

Я проверил учебники, и они называют методы рисования в краске ().

Это может быть старый учебник AWT. Это НЕ способ рисования в Swing. При использовании Swing вы должны переопределять метод paintComponent (...). Прочитайте раздел из учебника по Swing на Custom Painting для примера и дополнительной информации.

Однако я заметил, что краска () метод может вызываться несколько раз

Swing определит, когда нужно перекрасить компонент, и вызовет методы рисования.

Я хочу прочитать файл только один раз

Картина должна быть максимально эффективной. Поэтому добавьте код в конструктор вашего класса, чтобы прочитать файл.

1 голос
/ 25 июля 2010

Считайте файл в main (или в любом другом месте обычного потока управления вашей программы). Поместите данные в переменную экземпляра, доступную для JPanel.

В paint() прочитайте переменную экземпляра и извлеките данные, хранящиеся в ней.

Например:

public class Foo extends JPanel {
    private SomeDataStorageClass myData;
    public static void main(String[] args) {
        Foo f = new Foo();
        f.myData = readSomeData();
    }
    public void paint(Graphics g) {
        doSomeDrawing(myData);
    }
}
0 голосов
/ 27 июля 2010

Посмотрите на то, что называется Ленивый экземпляр или Ленивая загрузка .

http://en.wikipedia.org/wiki/Lazy_loading

Общая идея состоит в том, чтобы иметь поле, котороепервоначально null, затем создайте его экземпляр, когда это необходимо (и инициализируйте), затем последующие вызовы не будут воссоздавать его, поскольку он проверяет, создан ли он.что если вы планируете переопределить рисование компонента, есть специальный метод, называемый paintComponent для компонентов Swing.

Я должен также отметить, что моя идея lazy loading может быть, а может и не бытьлучший подход, но это то, что нужно учитывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...