2015-01-28 3 views
2

edit 2: Я решил, что было бы легче понять, если бы я просто поместил весь код, чтобы вы могли его протестировать.Страница графика Java Array Loop не работает

Редактировать: Я понимаю, что то, что я сказал, было неясным, поэтому я объясню это как можно лучше. В принципе, я рисую прямоугольники на графической странице, используя метод fillRect. Проблема в том, что когда я изменяю размер одного, все они меняются, так как все они перерисовываются каждый раз, когда нарисован новый. Чтобы исправить это, я добавил массив, который хранит все размеры, которые вводятся через колесо прокрутки в другой части проблемы. В любом случае, я знаю, что проблема изолирована от цикла, который якобы рисует их все определенного размера, поэтому я добавил цикл, который теоретически должен давать мне временную переменную каждый раз, чтобы использовать это, перерисовывая все размеры прямоугольника, начиная с 0 каждый время выполнения основного цикла. Проблема состоит в том, что на самом деле это не перерисовывает прямоугольники до их индивидуальных размеров и вместо этого рисует их до текущего размера. Я также обновил часть кода.

У меня возникли проблемы с проектом на Java. То, что он должен делать, это изменить размер каждого отдельного объекта прямоугольника, сохранив его в массиве, а затем воссоздать прямоугольники, основанные на длине массива. Я, по крайней мере, думаю, сделаю это, создав переменную, которая должна быть равна SIZE, которая будет изменена в другой части программы, а затем установите ее равной определенному элементу в массиве в i. Во всяком случае, когда я это делаю, я меняю все длины на любую текущую длину, когда рисую прямоугольник. Я знаю, что проблема заключается в том, что я использую i в части размера, но что бы я использовал? Заранее благодарю за любую помощь!

Вот код:

public class Dots 
{ 

public static void main(String[] args) 
{ 
    JFrame frame = new JFrame("Array Rectangles"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    DotsPanel dotsPanel = new DotsPanel(); 
    frame.getContentPane().add(dotsPanel); 

    //buttons 
    JButton btnNewButton = new JButton("RED"); 
    btnNewButton.setHorizontalAlignment(SwingConstants.LEFT); 
    btnNewButton.setVerticalAlignment(SwingConstants.BOTTOM); 
    btnNewButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
    } 
    }); 
    btnNewButton.setForeground(Color.RED); 
    dotsPanel.add(btnNewButton); 

    JButton btnNewButton_1 = new JButton("GREEN"); 
    btnNewButton_1.setForeground(Color.GREEN); 
    btnNewButton_1.setVerticalAlignment(SwingConstants.BOTTOM); 
    dotsPanel.add(btnNewButton_1); 

    JButton btnNewButton_2 = new JButton("BLUE"); 
    btnNewButton_2.setForeground(Color.BLUE); 
    dotsPanel.add(btnNewButton_2); 

    JButton btnNewButton_3 = new JButton("BLACK"); 
    btnNewButton_3.setForeground(new Color(0, 0, 0)); 
    dotsPanel.add(btnNewButton_3); 


    frame.pack(); 
    frame.setVisible(true); 
    } 
    } 



import java.util.ArrayList; 
import java.util.Random; 

import javax.swing.JPanel; 

import java.awt.*; 
import java.awt.event.*; 

public class DotsPanel extends JPanel 
{ 
// radius of each dot 
private int SIZE = 25; 
private int SIZEAccess; 

private static final Random generator = new Random(); 

//used to count amount of dots 
private ArrayList<Point> pointList; 

int[] sizes = new int [10000]; 


//Sets up this std. sized panel to listen for mouse events. 
public DotsPanel() 
{ 
    pointList = new ArrayList<Point>(); 

    addMouseListener (new DotsListener()); 
    addMouseMotionListener(new DotsListener()); 
    addMouseWheelListener(new DotsListener()); 

    setBackground(Color.white); 
    setPreferredSize(new Dimension(1024, 768)); 
} 


//used to generate a random color 
public static Color randomColor() { 
    return new Color(generator.nextInt(256), generator.nextInt(256), generator.nextInt(256)); 
} 

// Draws all of the dots stored in the list. 
public void paintComponent(Graphics page) 
{ 
    super.paintComponent(page); 

    //draws a centered dot of random color 
    int i = 0; 
    for (Point spot : pointList) 
    { 
     sizes[i] = SIZE; 
     //SIZEAccess = SIZE; 
     //sizes[i] = SIZEAccess; 
     //page.fillRect(spot.x-SIZE, spot.y-SIZE, SIZE*2, SIZE*2); 
     for (int temp = 0; temp <= i; temp++) 
      page.fillRect(spot.x-sizes[temp], spot.y-sizes[temp], sizes[temp]*2, sizes[temp]*2); 
     //page.fillRect(spot.x-SIZE, spot.y-SIZE, SIZE*2, SIZE*2); 
     //page.setColor(randomColor()); 

     //page.setColor(c) 
     i++; 

    } 

    //displays the amount of rectangles drawn at the top left of screen 
    page.drawString("Count: " + pointList.size(), 5, 15); 

    page.drawString("To change the size of the squares, use mouse scroll wheel.", 350, 15); 

    page.drawString("Size: " + SIZE, 950, 15); 

} 

// Represents the listener for mouse events. 
private class DotsListener implements MouseListener, MouseMotionListener, MouseWheelListener 
{ 

    // Adds the current point to the list of points and redraws 
    // the panel whenever the mouse button is pressed. 

    public void mousePressed(MouseEvent event) 
    { 
     pointList.add(event.getPoint()); 
     repaint(); 
    } 


    // Provide empty definitions for unused event methods. 

    public void mouseClicked(MouseEvent event) { 

    } 
    public void mouseReleased(MouseEvent event) { 

    } 
    public void mouseEntered(MouseEvent event) { 

    } 
    public void mouseExited(MouseEvent event) {} 


    // Adds the current point to the list of points and redraws 
    // the panel whenever the mouse button is dragged. 
    public void mouseDragged(MouseEvent event) { 
     pointList.add(event.getPoint()); 
     repaint(); 

    } 

    public void mouseMoved(MouseEvent event) { 

    } 


    public void mouseWheelMoved(MouseWheelEvent event) 
    { 
     int notches = 0; 
     notches = event.getWheelRotation(); 
     //int 

     if (notches > 0) 
     { 
      SIZE = SIZE + notches; 
      notches = 0; 
     } 
     else if (notches < 0) 
     { 
      int tempSIZE = SIZE; 
      tempSIZE = tempSIZE + notches; 
      //prevents the program from having dots that increase due to multiplying negatives by negatives 
      //by making anything less than 1 equal 1 
      if(tempSIZE < 1) 
       tempSIZE = 1; 
      SIZE = tempSIZE; 
      notches = 0; 

     } 
    } 
} 




//SIZE = SIZE + notches; 

} 
+2

Предполагается, что это анимация? Я не понимаю, что вы пытаетесь сделать. Если анимация, используйте таймер Swing, а не цикл for. –

+0

Извините, мое объяснение не было большим; это не анимация. Это программа, которая рисует прямоугольники при срабатывании MouseEvent. – itdev9345

+0

Пожалуйста, подумайте над редактированием своего вопроса с целью постараться сделать ваш вопрос максимально ясным. Попытайтесь объяснить свою проблему, как если бы вы объясняли это 6-летнему. Предположим, что мы ничего не знаем о вашем текущем проекте, желаниях или проблемах. –

ответ

2

Вы, кажется, есть ArrayList-й взаимодействующий с массивами в запутанной структуре, что делает его трудным для нас, чтобы следовать вашей логике. Это говорит о том, что ваша логика может быть слишком сложной для вашего собственного блага и что ваш код может выиграть от упрощения. Почему не вместо создания List<Rectangle>, такие как ArrayList<Rectangle>, а затем просто пройдёмся по этому списку в вашем методе paintComponent, и рисовать каждый прямоугольник с помощью draw(...) или fill(...) метод объекта Graphics2D в:

private List<Rectangle> rectangleList = new ArrayList<>(); 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    for (Rectangle rectangle : rectangleList) { 
     g2.fill(rectangle); 
    } 
} 

Например:

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.Rectangle; 
import java.awt.Stroke; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class Foo extends JPanel { 
    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private static final Color BACKGROUND = Color.black; 
    private static final Color FILL_COLOR = Color.pink; 
    private static final Color DRAW_COLOR = Color.red; 
    private static final Stroke STROKE = new BasicStroke(3); 
    private List<Rectangle> rectangleList = new ArrayList<>(); 
    private Point pressPoint = null; 
    private Point dragPoint = null; 

    public Foo() { 
     setBackground(BACKGROUND); 
     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 
    } 

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

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     Stroke oldStroke = g2.getStroke(); 
     g2.setStroke(STROKE); 
     for (Rectangle rectangle : rectangleList) { 
     g2.setColor(FILL_COLOR); 
     g2.fill(rectangle); 
     g2.setColor(DRAW_COLOR); 
     g2.draw(rectangle); 
     } 
     g2.setStroke(oldStroke); 
     if (pressPoint != null && dragPoint != null) { 
     g2.setColor(FILL_COLOR.darker()); 
     int x = Math.min(pressPoint.x, dragPoint.x); 
     int y = Math.min(pressPoint.y, dragPoint.y); 
     int width = Math.abs(pressPoint.x - dragPoint.x); 
     int height = Math.abs(pressPoint.y - dragPoint.y); 
     g2.drawRect(x, y, width, height); 
     } 
    } 

    private class MyMouseAdapter extends MouseAdapter { 
     @Override 
     public void mousePressed(MouseEvent e) { 
     pressPoint = e.getPoint(); 
     repaint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
     dragPoint = e.getPoint(); 
     repaint(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     dragPoint = e.getPoint(); 
     int x = Math.min(pressPoint.x, dragPoint.x); 
     int y = Math.min(pressPoint.y, dragPoint.y); 
     int width = Math.abs(pressPoint.x - dragPoint.x); 
     int height = Math.abs(pressPoint.y - dragPoint.y); 
     Rectangle rect = new Rectangle(x, y, width, height); 
     rectangleList.add(rect); 

     pressPoint = null; 
     dragPoint = null; 
     repaint(); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Foo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new Foo()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

Я не думал о том, что вы не используете массивы и не используете arrayLists, но это действительно делает то, что должен делать код. Мне придется с этим поработать, но большое спасибо за помощь! – itdev9345