JComponent setSize () и setLocation () не работают - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь настроить контейнер JComponent, который нарисовал aws прямоугольник с пунктирной границей. Проблема в том, что setLocation () и setSize () не работают. Я пробовал несколько вещей, например super.setSize () и super.setPrefferedSize ().

Для любого контекста я добавляю это в JPanel с помощью FlowLayout. JFrame имеет ширину 500 и высоту 300. Он запускается на Linux, в случае, если ОС имеет значение.

public class RectangleContainer extends JComponent{
int x = 0;
int y = 0;
int length = 50;
int dashLength = 10;

RectangleContainer(){
    super();
    setSize(60, 60);
    setPreferredSize(new Dimension(60, 60)); //length+dashLength
}

// @Override
// public void setSize(int width, int height){
//     this.length = (width > height) ? height:width;
//     super.setSize(length+dashLength, length+dashLength);
//     super.setPreferredSize(new Dimension(length+dashLength, length+dashLength));
//     revalidate();
// }

//TODO: add dashLength or not?
@Override
public Dimension getSize(){
    return new Dimension(length+dashLength, length+dashLength);
}

@Override
public void setLocation(int x, int y){
    super.setLocation(x, y);
    // System.out.println(String.format("X: %d", x));
    // System.out.println(String.format("Y: %d", y));

    // this.x = x;
    // this.y = y;
    // //super.setSize(length+dashLength+x, length+dashLength+y);
    // //super.setPreferredSize(new Dimension(length+dashLength+x, length+dashLength+y));
    // //repaint();
    // revalidate();
}

@Override
public Point getLocation(){
    return new Point(this.x, this.y);
}

//Code altered, but mainly from http://www.java2s.com/Code/Java/2D-Graphics-GUI/Dashedstroke.htm
@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    setBackground(Color.white);

    Graphics2D g2 = (Graphics2D) g;

    g2.setStroke(new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, dashLength, new float[]{dashLength}, 0.0f));
    g2.setPaint(Color.black);
    Rectangle r = new Rectangle(x, y, length, length);

    g2.draw(r);
}
}

1 Ответ

1 голос
/ 21 июня 2020

Если все, что вы пытаетесь выполнить sh - это создать компонент с пунктирной рамкой в ​​указанном c месте, то я надеюсь, что этот пример поможет вам начать работу

    public class DashTest
    {
     public static void main(String args[])
     {
      JFrame frame=new JFrame("Dash Test");
    
      frame.setContentPane(new JPanel(null)); /*A panel with no layout as the main container*/
    
      JButton button=new JButton("Dashed Button");
    
      button.setBorder(BorderFactory.createDashedBorder(Color.red));
    /*swing comes inbuilt with custom borders*/
    
  
     button.setBounds(100,100,150,30);/*set the x,y,width,height of the button works only if you have no layout set as shown above*/
    
     frame.add(button);
    
     frame.setSize(500,500);
    
     frame.setVisible(true);
     }
    }    

Для ваших целей нет необходимости подклассифицировать свой компонент JComponent только для использования границ, однако, если вы пытаетесь делать более необычные вещи внутри своего компонента, а не только границу, вам нужно переопределить этот метод компонента рисования компонентов

class MyComponent extends JComponent
{  
 MyComponent ()
 {
  super();
    
  setBorder(BorderFactory.createDashedBorder(Color.red));/*keep the red border*/
  }

 @Override
 public void paintComponent(Graphics g)
{
 super.paintComponent(g);/*NEVER FORGET THIS*/

 Graphics2D g2d=(Graphics2D)g;

 /*do more creative stuff now with graphics*/
 }
}
...