Pergunta

Eu estou procurando a descrição mais básico de como desenhar texto dentro de um JPanel. Eu sei que há um bilhão de tutoriais lá fora, mas nenhum deles está clicando comigo e eu tenho algumas perguntas específicas que podem ajudar os outros que estão confusos. Como uma configuração (um app de testes) Eu tenho uma única classe que tem um JLabel, um JTextField, um JButton e um JPanel. O aplicativo lê em ints de um arquivo externo e deve exibir sua média no painel quando o JButton é pressionado. Eu tenho toda a programação subjacente resolvido (ou seja, o botão responde e imprime a média para a linha de comando), mas eu simplesmente não consigo classificar para fora como imprimir a média para o painel. Acho que minha maior questão é como incorporar o () ou método paintComponet paint () em conjunto com o resto do código. Caso seja a sua própria classe? Caso os JPanel seja da própria classe? Parece que isso é o que a maioria dos tutoriais estão me dizendo, eu não sou apenas certo que o primeiro passo é exatamente. Os olhares código como:

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);
}
}

Toda e qualquer ajuda / direção é apreciado. Eu sei que eu usei este código recentemente para outras questões, eu só quero saber tudo! Idealmente, o painel exibirá a média da leitura em ints quando o botão foi clicado, e mostrar tudo o que foi celebrado o textfeild quando o foco era sobre ele e entrar foi pressionado, mas eu estou tomando passos de bebê, e como eu disse, Eu gostaria que esta discussão para ser um tutorial geral para os outros com perguntas semelhantes que não estão encontrando respostas de docs sol ou outros sites. Muito obrigado antecipadamente. Dan :)

Foi útil?

Solução

Criar uma classe interna que se estende JPanel dentro de sua classe principal:

class MyPanel extends JPanel {

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

}

Em seguida, você precisa chamar repaint em que o painel depois de chamar computeAverage () in actionPerformed:

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

Outras dicas

Adicionar um JLabel ao JPanel.

Chamada setText (String) no JLabel e seu texto será desenhado dentro do JPanel.

1) faz um JFrame não tem um método paintComponent () para que o código que você postou não vai fazer nada. Você precisa criar um JPanel personalizada e substituir seu método paintComponent () para fazer a sua pintura personalizada.

2) Mesmo se você fizer o acima, a pintura ainda não será exibido porque um painel por padrão tem um tamanho zero. Então, então você vai precisar para definir o tamanho preferido do painel para se certificar de que é visível.

3) Por que você está mesmo fazendo isso. Tudo que você precisa fazer é usar um JLabel e definir o texto do JLabel.

Acho que é difícil acreditar que você olhou para outros tutoriais. O tutorial balanço na pintura personalizado tem uma linha 20 programa que mostra o básico.

Eu acho que você não deve ser subclasse JFrame. Faça uma instância de JFrame uma instância
variável da classe principal e adicionar o JPanel etc. a ele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top