2017-08-24 70 views
1

我試圖創建一種通過使用line2d/graphics2d創建「條形圖」形式來可視化arraysorting的方法。這個想法是在x軸上有數組索引,然後在y上使用不同的排序方法並更新它。所以我試圖使用arrayList來存儲y值,然後在paint方法中使用for循環來繪製所有行,但似乎每當我嘗試並使用repaint重置我的arrayList時,我該如何執行此操作?使用arrayList作爲graphics2d中的y座標

下面是我使用的代碼:

import javax.swing.*; 
import java.awt.BasicStroke; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import java.util.ArrayList; 
import java.util.Random; 

public class Frame_Main extends JFrame { 

    private JPanel screen = new Screen(); 
    private Screen _screen = new Screen(); 

    private int rndMaxRange = 100; 
    private int maxArraySize = 50; 

    // TODO Make sure static is really needed 
    public static ArrayList<Integer> array = new ArrayList<>(); 

    public Frame_Main() { 
     this.setSize(700, 500); 
     this.setVisible(true); 
     this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     this.add(screen); 
    } 

    public static void main(String[] args) { 
     Frame_Main m = new Frame_Main(); 

     m.randomizeArray(array); 
     m.refreshVisuals(array); 
    } 

    public void refreshVisuals(ArrayList<Integer> arrayList) { 

     _screen.setArrayList(arrayList); 
     _screen.repaint(); 

     System.out.println("Refreshed drawing. Screen Array Size: " + _screen.lineArrayList.size()); 
    } 

    public void randomizeArray(ArrayList<Integer> arrayList) { 
     arrayList.clear(); 
     Random rnd = new Random(); 

     for (int i = 0; i < maxArraySize; i++) { 
      arrayList.add(rnd.nextInt(rndMaxRange) + 1); 
     } 

     System.out.println("Created an array with the size: " + arrayList.size()); 
    } 
} 

class Screen extends JPanel { 

    public ArrayList<Integer> lineArrayList = new ArrayList<>(); 

    // private int canvasWidth = Frame_Main.WIDTH; 
    private int lineWidth; 

    public void setArrayList(ArrayList<Integer> arrayList) { 
     lineArrayList.addAll(arrayList); 
    } 

    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 

     lineWidth = 3; 
     g2.setStroke(new BasicStroke(lineWidth)); 

     System.out.println("lineArrayList Size: " + lineArrayList.size()); 

     int x = 0; 

     for (int i : lineArrayList) { 
      g2.draw(new Line2D.Float(x, x, 0, i)); 
      x = x + lineWidth; 
     } 
    } 
} 
+0

'「每當我嘗試使用重繪它重置我的ArrayList ......」「 - 請告訴更多的究竟發生了什麼事的細節。 「重置我的數組列表」是什麼意思? –

+0

對不起。當我使用graphics2d內置的repaint/paint方法時,它似乎將我的arrayList大小設置爲零/清除數組列表。我試過使用斷點,似乎我的屏幕類中的arrayList的大小正確,直到我調用paint()或repaint(),這意味着如果我在這些方法期間中斷數組列表大小爲0.希望清除它! – Walrusser

+0

這些信息太重要了,無法評論。請[編輯]您的原始帖子,並將其包含在內以供所有人查看。 –

回答

1

你不是你_SCREEN變量添加到GUI,它永遠不會顯示出來,因此調用repaint()它什麼都不做。

所以對於starteres,改變

this.add(screen); 

到:

add(_screen); 

其它無關的問題:

  • 您應該重寫JPanel的paintComponent的方法裏面,而不是它的paint方法
  • 你應該先打電話給超級的繪畫方法你的重寫中的東西。

例如,像...

import java.awt.BasicStroke; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
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 MyScreen extends JPanel { 
    private static final int PREF_W = 700; 
    private static final int PREF_H = 500; 
    private static final int LINE_WIDTH = 5; 
    private static final Stroke STROKE = new BasicStroke((float) LINE_WIDTH); 
    private static final int MAX_DATA_SIZE = 50; 
    private static final int MAX_RANGE = 400; 
    private List<Integer> displayData = new ArrayList<>(); 
    private Random random = new Random(); 

    public MyScreen() { 
     for (int i = 0; i < MAX_DATA_SIZE; i++) { 
      displayData.add(random.nextInt(MAX_RANGE) + 1); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     // to do house-keeping painting 
     super.paintComponent(g); 

     // to smooth out graphics 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     if (displayData == null) { 
      return; 
     } 

     g2.setStroke(STROKE); 
     int x = 0; 
     for (Integer i : displayData) { 
      g2.drawLine(x, x, 0, i); 
      x += LINE_WIDTH; 
     } 
    } 


    private static void createAndShowGui() { 
     MyScreen mainPanel = new MyScreen(); 

     JFrame frame = new JFrame("My Screen"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
}