kzen.dev
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 user1058210
user1058210
Question

Menggambar grafik garis sederhana di Java

Dalam program saya, saya ingin menggambar grafik garis skor sederhana. Saya memiliki sebuah file teks dan pada setiap baris adalah skor integer, yang saya baca dan ingin saya berikan sebagai argumen untuk kelas grafik saya. Saya mengalami kesulitan dalam mengimplementasikan kelas grafik dan semua contoh yang saya lihat memiliki metode di kelas yang sama dengan kelas utama mereka, yang tidak akan saya miliki.

Saya ingin dapat mengoper array saya ke objek dan menghasilkan grafik, tetapi ketika memanggil metode paint saya, ia meminta saya untuk membuat grafik ... Inilah yang saya miliki sejauh ini:

public class Graph extends JPanel {

    public void paintGraph (Graphics g){

        ArrayList<Integer> scores = new ArrayList<Integer>(10);

        Random r = new Random();

        for (int i : scores){
            i = r.nextInt(20);
            System.out.println(r);
        }

        int y1;
        int y2;

        for (int i = 0; i < scores.size(); i++){
            y1 = scores.get(i);
            y2 = scores.get(i+1);
            g.drawLine(i, y1, i+1, y2);
        }
    }
}

Untuk saat ini saya telah memasukkan generator angka acak sederhana untuk mengisi array saya.

Saya memiliki bingkai yang sudah ada dan pada dasarnya ingin membuat instance kelas Graph dan memasang panel ke bingkai saya. Saya benar-benar minta maaf karena pertanyaan ini tampak begitu campur aduk, tapi saya kurang tidur....

Kode dalam pernyataan utama saya adalah:

testFrame = new JFrame();
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Graph graph = new Graph();
testFrame.add(graph);

Saya tidak yakin apa sebenarnya SSCE itu, tetapi ini adalah upaya saya untuk itu:

public class Test {

    JFrame testFrame;
    public Test() {
        testFrame = new JFrame();
        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Graph graph = new Graph();
        testFrame.add(graph);
        testFrame.setBounds(100, 100, 764, 470);
        testFrame.setVisible(true);
    }

Graph.java

public class Graph extends JPanel {
    public Graph() {
       setSize(500, 500);
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D gr = (Graphics2D) g; // This is if you want to use Graphics2D
        // Now do the drawing here
        ArrayList<Integer> scores = new ArrayList<Integer>(10);

        Random r = new Random();

        for (int i : scores) {
            i = r.nextInt(20);
            System.out.println(r);
        }

        int y1;
        int y2;

        for (int i = 0; i < scores.size() - 1; i++) {
            y1 = (scores.get(i)) * 10;
            y2 = (scores.get(i + 1)) * 10;
            gr.drawLine(i * 10, y1, (i + 1) * 10, y2);
        }
    }
}
24 2012-01-01T13:37:45+00:00 3
Peter Mortensen
Peter Mortensen
Pertanyaan edit 6 November 2014 в 7:32
Pemrograman
java
swing
graphics2d
linegraph
Pertanyaan ini memiliki :value jawaban dalam bahasa Inggris, untuk membacanya masuk ke akun Anda.
Solution / Answer
Hovercraft  Full Of Eels
Hovercraft Full Of Eels
1 Januari 2012 в 2:48
2012-01-01T14:48:30+00:00
Lebih
Sumber
Sunting
#15086157

Masalah dengan kode dan saran Anda:

  • Sekali lagi Anda perlu mengubah preferredSize dari komponen (di sini JPanel Grafik), bukan ukurannya
  • Jangan mengatur batas JFrame.
  • Panggil pack() pada JFrame Anda setelah menambahkan komponen ke dalamnya dan sebelum memanggil setVisible(true)
  • Perulangan foreach Anda tidak akan bekerja karena ukuran ArrayList Anda adalah 0 (uji untuk melihat bahwa ini benar). Sebagai gantinya gunakan perulangan for dari 0 sampai 10.
  • Anda seharusnya tidak memiliki logika program di dalam metode paintComponent(....) Anda, tetapi hanya kode pengecatan. Jadi saya akan membuat ArrayList sebagai variabel kelas dan mengisinya di dalam konstruktor kelas.

Sebagai contoh:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.*;

@SuppressWarnings("serial")
public class DrawGraph extends JPanel {
   private static final int MAX_SCORE = 20;
   private static final int PREF_W = 800;
   private static final int PREF_H = 650;
   private static final int BORDER_GAP = 30;
   private static final Color GRAPH_COLOR = Color.green;
   private static final Color GRAPH_POINT_COLOR = new Color(150, 50, 50, 180);
   private static final Stroke GRAPH_STROKE = new BasicStroke(3f);
   private static final int GRAPH_POINT_WIDTH = 12;
   private static final int Y_HATCH_CNT = 10;
   private List<Integer> scores;

   public DrawGraph(List<Integer> scores) {
      this.scores = scores;
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D)g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

      double xScale = ((double) getWidth() - 2 * BORDER_GAP) / (scores.size() - 1);
      double yScale = ((double) getHeight() - 2 * BORDER_GAP) / (MAX_SCORE - 1);

      List<point> graphPoints = new ArrayList<point>();
      for (int i = 0; i < scores.size(); i++) {
         int x1 = (int) (i * xScale + BORDER_GAP);
         int y1 = (int) ((MAX_SCORE - scores.get(i)) * yScale + BORDER_GAP);
         graphPoints.add(new Point(x1, y1));
      }

      // create x and y axes 
      g2.drawLine(BORDER_GAP, getHeight() - BORDER_GAP, BORDER_GAP, BORDER_GAP);
      g2.drawLine(BORDER_GAP, getHeight() - BORDER_GAP, getWidth() - BORDER_GAP, getHeight() - BORDER_GAP);

      // create hatch marks for y axis. 
      for (int i = 0; i < Y_HATCH_CNT; i++) {
         int x0 = BORDER_GAP;
         int x1 = GRAPH_POINT_WIDTH + BORDER_GAP;
         int y0 = getHeight() - (((i + 1) * (getHeight() - BORDER_GAP * 2)) / Y_HATCH_CNT + BORDER_GAP);
         int y1 = y0;
         g2.drawLine(x0, y0, x1, y1);
      }

      // and for x axis
      for (int i = 0; i < scores.size() - 1; i++) {
         int x0 = (i + 1) * (getWidth() - BORDER_GAP * 2) / (scores.size() - 1) + BORDER_GAP;
         int x1 = x0;
         int y0 = getHeight() - BORDER_GAP;
         int y1 = y0 - GRAPH_POINT_WIDTH;
         g2.drawLine(x0, y0, x1, y1);
      }

      Stroke oldStroke = g2.getStroke();
      g2.setColor(GRAPH_COLOR);
      g2.setStroke(GRAPH_STROKE);
      for (int i = 0; i < graphPoints.size() - 1; i++) {
         int x1 = graphPoints.get(i).x;
         int y1 = graphPoints.get(i).y;
         int x2 = graphPoints.get(i + 1).x;
         int y2 = graphPoints.get(i + 1).y;
         g2.drawLine(x1, y1, x2, y2);         
      }

      g2.setStroke(oldStroke);      
      g2.setColor(GRAPH_POINT_COLOR);
      for (int i = 0; i < graphPoints.size(); i++) {
         int x = graphPoints.get(i).x - GRAPH_POINT_WIDTH / 2;
         int y = graphPoints.get(i).y - GRAPH_POINT_WIDTH / 2;;
         int ovalW = GRAPH_POINT_WIDTH;
         int ovalH = GRAPH_POINT_WIDTH;
         g2.fillOval(x, y, ovalW, ovalH);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGui() {
      List<Integer> scores = new ArrayList<Integer>();
      Random random = new Random();
      int maxDataPoints = 16;
      int maxScore = 20;
      for (int i = 0; i < maxDataPoints ; i++) {
         scores.add(random.nextInt(maxScore));
      }
      DrawGraph mainPanel = new DrawGraph(scores);

      JFrame frame = new JFrame("DrawGraph");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Yang akan membuat grafik yang terlihat seperti ini: masukkan deskripsi gambar di sini

 user1585643
user1585643
Jawaban edit 24 Agustus 2012 в 1:40
51
0
 DejanLekic
DejanLekic
1 Januari 2012 в 2:54
2012-01-01T14:54:10+00:00
Lebih
Sumber
Sunting
#15086158

Atau cukup gunakan pustaka JFreechart - http://www.jfree.org/jfreechart/ .

9
0
Petar Minchev
Petar Minchev
1 Januari 2012 в 1:40
2012-01-01T13:40:10+00:00
Lebih
Sumber
Sunting
#15086156

Timpa metode paintComponent dari panel Anda sehingga Anda dapat menggambar secara kustom. Seperti ini:

@Override
public void paintComponent(Graphics g) {
    Graphics2D gr = (Graphics2D) g; //this is if you want to use Graphics2D
    //now do the drawing here
    ...
}
Petar Minchev
Petar Minchev
Jawaban edit 1 Januari 2012 в 1:56
3
0
Related communities 3
Programmer JAVA indonesia
Programmer JAVA indonesia
1 726 pengguna
Buka telegram
jvmusergroup
jvmusergroup
359 pengguna
Bismillahirrohmanirohim. Perhatian! Grup ini merupakan ekspansi dari grup Forum Java Programmer Indonesia di Facebook. Silahkan berbagi pengalaman dan masalah seputar Java dan keluarganya. https://t.me/JVMIndonesia Admin : @hendisantika34
Buka telegram
Java Indonesia🇲🇨
Java Indonesia🇲🇨
154 pengguna
Programmer Java Indonesia. Grup ini digunakan untuk bertanya terkait materi belajar Java / fullstack Warning=> -dilarang promosi(izin adm -18+🔞 - berbicara sopan - no spam /boot Mohon ikut aturan grup belum di keluarkan
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
ALEX EPRST
Terdaftar 15 jam yang lalu
2
Daniel Gogov
Terdaftar 1 minggu yang lalu
3
工藤 芳則
Terdaftar 2 minggu yang lalu
4
Ирина Беляева
Terdaftar 2 minggu yang lalu
5
Darya Arsenyeva
Terdaftar 3 minggu yang lalu
ES
ID
JA
© kzen.dev 2023
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi