Вопрос

Я ищу самое простое описание того, как рисовать текст в JPanel.Я знаю, что существует миллиард руководств, но ни одно из них меня не устраивает, и у меня есть несколько конкретных вопросов, которые могут помочь другим, кто запутался.В качестве установки (приложения для тестирования) у меня есть один класс, который имеет JLabel, JTextField, JButton и JPanel.Приложение считывает целые числа из внешнего файла и должно отображать их среднее значение на панели при нажатии кнопки JButton.У меня разобрались со всем базовым программированием (то есть кнопка реагирует и выводит среднее значение в командную строку), но я просто не могу понять, как вывести среднее значение на панель.Полагаю, мой самый большой вопрос заключается в том, как включить метод Paint() или PaintComponet() вместе с остальным кодом.Должен ли это быть отдельный класс?Должен ли JPanel быть отдельным классом?Похоже, именно об этом мне говорят большинство руководств, я просто не уверен, какой именно первый шаг.Код выглядит так:

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

public class Main extends JFrame implements ActionListener {
  private int[] intArray = new int[10000];
  private int numOfInts = 0;
  private int avg = 0;

  protected JButton avgBtn;
  protected JTextField indexEntry;
  protected JLabel instructions;
  protected JPanel resultsPanel;

  public Main(){

    //create main frame
    this.setTitle("Section V, question 2");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(350, 250);
    this.setLayout(new GridLayout(4, 1));

    //create instruction label and add to frame
    instructions = new JLabel("Follow the instructions on the exam to use this program");
    this.add(instructions);

    //create textfield for index entry and add to frame
    indexEntry = new JTextField();
    this.add(indexEntry);

    //create button for average and add to frame
    avgBtn = new JButton("Click for Average");
    this.add(avgBtn);
    avgBtn.addActionListener(this);

    //create panel to display results and add to frame
    resultsPanel = new JPanel();
    resultsPanel.setBackground(Color.BLUE);
    this.add(resultsPanel);

    //read in from file
    readFromFile();

    //compute average
    computeAverage();
  }

  private void readFromFile() {
    try {
            // Open the file
            FileInputStream fstream = new FileInputStream("numbers.dat");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

            //create placeholder for read in ints
            String strLine;

            //Read File Line By Line
            int i = 0;
            while ((strLine = br.readLine()) != null) {
              //place ints in array and increament the count of ints
              System.out.println (strLine);
              intArray[i] = Integer.parseInt(strLine);
              numOfInts++;
              i++;
            }
            //Close the input stream
            in.close();
            System.out.println ("numOfInts = " + numOfInts);
    }
    catch (Exception e) {
            //Catch exception if any
            System.err.println("Error: " + e.getMessage());
    }
  }

  //compute averaage
  private void computeAverage() {
    int sum = 0;
    for (int i = 0; i < numOfInts; i++)
    sum += intArray[i];
    avg = sum/numOfInts;
    System.out.println("avg = " + avg);
  }

//event handling
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == avgBtn) {
            computeAverage();
    }
}

//"main" function
public static void main(String[] args) {
    Main m = new Main();
    m.setVisible(true);
}

//paint
public void paintComponent(Graphics g){
  g.drawString(avg, 75, 75);
}
}

Любая помощь/направление приветствуется.Я знаю, что недавно использовал этот код для других вопросов, я просто хочу знать все!В идеале панель должна отображать среднее значение прочитанного в целых числах при нажатии кнопки и отображать все, что было введено в текстовое поле, когда на нем находится фокус и нажимается ввод, но я делаю маленькие шаги, и, как я уже сказал, Я бы хотел, чтобы эта тема стала общим руководством для других, у которых есть похожие вопросы и которые не могут найти ответы в Sun Docs или на других сайтах.Большое спасибо заранее.Дэн :)

Это было полезно?

Решение

Создайте внутренний класс, расширяющий JPanel внутри вашего основного класса:

class MyPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString(Integer.toString(avg), 75, 75);
    }

}

Затем вам нужно вызвать перерисовку на этой панели после вызова ComputeAverage() в actionPerformed:

//event handling
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == avgBtn) {
        computeAverage();
        panel.repaint();
    }
}

Другие советы

Добавьте JLabel в JPanel.

Вызовите setText(String) в JLabel, и ваш текст будет нарисован внутри JPanel.

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

2) Даже если вы сделаете вышеописанное, рисунок все равно не будет отображаться, поскольку по умолчанию панель имеет нулевой размер.Поэтому вам нужно будет установить предпочтительный размер панели, чтобы убедиться, что она видна.

3) Зачем ты вообще это делаешь?Все, что вам нужно сделать, это использовать JLabel и установить текст JLabel.

Мне трудно поверить, что вы просматривали другие уроки.Учебное пособие по Swing Картина на заказ имеет программу из 20 строк, показывающую основы.

Я думаю, вам не следует создавать подклассы JFrame.Сделать экземпляр JFrame экземпляром
переменная класса Main и добавьте JPanel и т.д.к этому.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top