В каком порядке все рисуется в Свинге? - Java

Узнай цену своей работы

Формулировка задачи:

Привет всем, никак не могу понять вот что. Сначала примерно объясню, что у меня происходит на данный момент. Есть у меня JFrame, на него я добавил всякой мешуры, типа JButton, еще добавил одну большую JPanel(точнее наследник) и еще неизвестное на момент компиляции количество маленьких JPanel. Эти малютки размещаются на большой панели. Также на момент компиляции неизвестны координаты этих малюток, рассчитываются они от атрибута экземпляра моей большой панели, но при задании координат малюток этот атрибут =0. Проблема именно в том, что он =0, а должен быть другим числом. И этот атрибут внутри большой панели рассчитывается от getWidth(). Т.е.
class bigPanel extends JPanel{
    a=getWidth()+blabla*4/blabla2
}
 
....
 
JPanel point=new JPanel;
point.setLocation(a+bla*bla2, a-bla*bla2);
Вот код с удаленными ненужными элементами, хотя вряд ли он так сразу заработает, если скопировать, но надеюсь знающие люди скажут, что у меня в нем не так.
package mainPackage;
 
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.border.*;
import com.jgoodies.forms.factories.*;
import com.jgoodies.forms.layout.*;
 
class Point extends JPanel{
    static private final int pointRad=6;
    private int state; //0-пусто, 1-точка первого игрока(красная), 2-точка второго игрока(синяя)
        Point(){
            state=0;
        }
    static public int getPointRad(){return pointRad;}
}

class JField extends JPanel{
    private int fieldSize;
    private int ident;
    private int step;
 
    JField(){
        this.setOpaque(true);
        fieldSize=10;
        ident=50;
    }
 
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        step=(this.getWidth()-2*ident)/(fieldSize-1);
        Graphics2D g2d=(Graphics2D)g;
        g2d.setColor(Color.black);
        for(int i=0; i<fieldSize;i++){
            g2d.drawLine(ident,ident+i*step,this.getWidth()-ident,ident+i*step);//Горизонтальные линии
            g2d.drawLine(ident+i*step,ident,ident+i*step,this.getHeight()-ident);//Вертикальные линии
        }
    }
 
    public int getFieldSize(){return fieldSize;}
    public int getIdent(){return ident;}
    public int getStep(){return step;}
    public void setStep(int step){this.step=step;}
    public void setIdent(int ident){this.ident=ident;}
}
 
class DotsGUI extends JPanel {
    public DotsGUI() {
        initComponents();
    }

    private void initComponents() {
        // JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents
        mainFrame = new JFrame();
        fieldPanel = new JField(););
 
        //======== mainFrame ========
        {
            mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            mainFrame.setIconImage(new ImageIcon("E:\\Projects\\Java\\DotsGameSwing\\icon.gif").getImage());
            mainFrame.setVisible(true);
            mainFrame.setTitle("Dots");
            Container mainFrameContentPane = mainFrame.getContentPane();
            mainFrameContentPane.setLayout(null);
 
            //---- fieldPanel ----
            fieldPanel.setBackground(new Color(163, 187, 255));
            fieldPanel.setVisible(true);
            mainFrameContentPane.add(fieldPanel);
            fieldPanel.setBounds(60, 5, 460, 460);
            fieldPanel.setLayout(null);

            //---- pointArray ----
            pointArray=new Point[fieldPanel.getFieldSize()][fieldPanel.getFieldSize()];
            for(int i=0;i<fieldPanel.getFieldSize();i++)
                for(int j=0;j<fieldPanel.getFieldSize();j++){
                    pointArray[i][j]=new Point();
                    fieldPanel.add(pointArray[i][j]);
                    pointArray[i][j].setBackground(Color.black);
                    pointArray[i][j].setSize(Point.getPointRad()*2,Point.getPointRad()*2);
                    pointArray[i][j].setLocation(fieldPanel.getIdent() + j * fieldPanel.getStep() - Point.getPointRad(), fieldPanel.getIdent() + i * fieldPanel.getStep() - Point.getPointRad());
                    pointArray[i][j].setBackground(Color.black);
                }
 
            mainFrameContentPane.setPreferredSize(new Dimension(600, 600));
            mainFrame.setSize(600, 600);
            mainFrame.setLocationRelativeTo(null);
 
        }
        // JFormDesigner - End of component initialization  //GEN-END:initComponents
    }
 
    // JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables
    private JFrame mainFrame;
    private JField fieldPanel;
    private Point pointArray[][];
    // JFormDesigner - End of variables declaration  //GEN-END:variables
}

Решение задачи: «В каком порядке все рисуется в Свинге?»

textual
Листинг программы
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.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
 
@SuppressWarnings("serial")
public class TicTacToeGrid extends JComponent {
    private static int GRID_SIZE = 20;
    private static int CELL_SIZE = 25;
    private static int TOTAL_SIZE = CELL_SIZE * GRID_SIZE;
    private static double DIAMETER = 0.7 * CELL_SIZE;
    private int[][] grid;
    private int[] hoverCell;
    private List<int[]> rowsCells;
 
    public TicTacToeGrid() {
        setPreferredSize(new Dimension(40 + TOTAL_SIZE, 20 + TOTAL_SIZE));
        grid = new int[GRID_SIZE][];
        for (int i = 0; i < grid.length; i++)
            grid[i] = new int[GRID_SIZE];
        rowsCells = new ArrayList<int[]>();
        MouseAdapter listener = new Listener();
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }
 
    private final class Listener extends MouseAdapter {
        private int cellValue(MouseEvent e) {
            return ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0) ? 1
                    : ((e.getModifiersEx() & MouseEvent.BUTTON3_DOWN_MASK) != 0) ? -1 : 0;
        }
 
        private void modifyCell(MouseEvent e) {
            int[] cell = cellFromPoint(e.getPoint());
            if (cell != null) {
                grid[cell[0]][cell[1]] = cellValue(e);
                updateRows(cell[0], cell[1]);
                repaint();
            }
        }
 
        private void updateHover(MouseEvent e) {
            int[] h = cellFromPoint(e.getPoint());
            if ((h != null) != (hoverCell != null))
                repaint();
            if (h != null && hoverCell != null && (h[0] != hoverCell[0] || h[1] != hoverCell[1]))
                repaint();
            hoverCell = h;
            rowsCells.clear();
            if (h != null && grid[h[0]][h[1]] != 0)
                updateRows(h[0], h[1]);
        }
 
        @Override
        public void mousePressed(MouseEvent e) {
            modifyCell(e);
        }
 
        @Override
        public void mouseDragged(MouseEvent e) {
            modifyCell(e);
            updateHover(e);
        }
 
        @Override
        public void mouseMoved(MouseEvent e) {
            updateHover(e);
        }
    }
 
    private int[] cellFromPoint(Point point) {
        int w = getWidth();
        int h = getHeight();
        double x = (point.x - 0.5 * (w - TOTAL_SIZE)) / CELL_SIZE;
        double y = (point.y - 0.5 * (h - TOTAL_SIZE)) / CELL_SIZE;
        if (x >= 0 && x < GRID_SIZE && y >= 0 && y < GRID_SIZE)
            return new int[] { (int) x, (int) y };
        return null;
    }
 
    private void updateRows(int x, int y) {
        rowsCells.clear();
        int value = grid[x][y];
        if (value == 0)
            return;
        rowsCells.add(new int[] { x, y });
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                if (i == 0 && j == 0)
                    continue;
                int l = 1;
                int xx = x + i * l;
                int yy = y + j * l;
                while (xx >= 0 && xx < GRID_SIZE && yy >= 0 && yy < GRID_SIZE && grid[xx][yy] == value) {
                    rowsCells.add(new int[] { xx, yy });
                    xx += i * l;
                    yy += j * l;
                }
            }
        }
    }
 
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.white);
        int w = getWidth();
        int h = getHeight();
        g.fillRect(0, 0, w, h);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
        g2d.translate(0.5 * (w - TOTAL_SIZE), 0.5 * (h - TOTAL_SIZE));
        if (hoverCell != null) {
            int x = hoverCell[0] * CELL_SIZE;
            int y = hoverCell[1] * CELL_SIZE;
            g2d.setColor(Color.lightGray);
            g2d.fill(new Rectangle2D.Double(x, y, CELL_SIZE, CELL_SIZE));
        }
        g2d.setColor(Color.green);
        for (int[] cell : rowsCells) {
            int x = cell[0] * CELL_SIZE;
            int y = cell[1] * CELL_SIZE;
            g2d.fill(new Rectangle2D.Double(x, y, CELL_SIZE, CELL_SIZE));
        }
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == 0)
                    continue;
                double r = 0.5 * DIAMETER;
                double x = (0.5 + i) * CELL_SIZE - r;
                double y = (0.5 + j) * CELL_SIZE - r;
                Color color = (grid[i][j] > 0) ? Color.red : Color.blue;
                g2d.setColor(color);
                g2d.fill(new Ellipse2D.Double(x, y, DIAMETER, DIAMETER));
            }
        }
        g2d.setColor(Color.black);
        for (int i = 0; i <= grid.length; i++) {
            double pos = 0.5 + i * CELL_SIZE;
            g2d.draw(new Line2D.Double(0, pos, TOTAL_SIZE, pos));
            g2d.draw(new Line2D.Double(pos, 0, pos, TOTAL_SIZE));
        }
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Tic-Tac-Toe Grid");
                frame.add(new TicTacToeGrid());
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5