2013-06-24 3 views
0

Что случилось со следующим кодом? Почему не прямоугольник отображенияРисование прямоугольников с JPanel в Java

public class SynapsePermanencesViewer { 

public JPanel createContentPane(Region region) { 
JPanel synapseLayer = new JPanel(); 
synapseLayer.setLayout(null); 

Column[][] columns = region.getColumns(); 

JPanel redSquare = new JPanel(); 
Color color = new Color(128, 0, 0); 
redSquare.setBackground(color); 
int squareLength = 50; 
redSquare.setSize(squareLength, squareLength); 

// calculate the correct location 
redSquare.setLocation(150, 150); // <==== This square isn't displaying WHY??? 

synapseLayer.setOpaque(true); 
return synapseLayer; 
} 

public SynapsePermanencesViewer(Region region) { 
JFrame frame = new JFrame("Synapse Permanences Viewer"); 

frame.setContentPane(this.createContentPane(region)); 

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.pack(); 
frame.setVisible(true); 
} 

public static void main(String[] args) { 
Region parentRegion = new Region("parentRegion", 2, 2, 1, 20, 1); 
Region childRegion = new Region("childRegion", 4, 4, 1, 20, 3); 
RegionToRegionConnect connectType = new RegionToRegionRectangleConnect(); 
connectType.connect(childRegion, parentRegion, 0, 0); 

SynapsePermanencesViewer object = new SynapsePermanencesViewer(parentRegion); 
} 

}

+0

Возможно, это связано с тем, что redSquare не добавляется ни к чему для отображения. Он только создается локально и GCed, когда метод возвращается. – jpm

ответ

2
  1. Вы не добавить RedSquare к synapseLayer.

  2. Даже если вы добавили квадрат, он не будет отображаться, потому что в файле synapseLayer используется нулевой макет, поэтому размер этой панели равен (0, 0). Поэтому, когда вы упаковываете фрейм, ничего не показывать.

Не используйте нулевой макет !!! Пусть менеджер компоновки определит размер панелей для вас, чтобы метод pack() работал правильно.

+0

Фактически, он показывался при добавлении, но мне пришлось вручную растянуть размер JFrame. – Humungus

+1

@Humungus, Точно, это проблема, когда вы не используете диспетчер компоновки. Пакет() не работает, поэтому вам необходимо вручную изменить размер фрейма. Это НЕ хороший дизайн, и пользователи будут жаловаться. – camickr