我已经设法创建了大部分日历,所有JLabel和盒子都在适当的位置(如果你想看到更多的代码,只是问一下,但是太多通常不赞成)并且我想调整所有的表示日历中日期的框。它们应该是整齐的小方块,就像它们在任何日历上一样。
我做的时候
dayBoxNumbers[7].setPreferredSize(new Dimension(50,50));
它会调整日历中每个JLabel的大小,以包含一周中的日期等等。整个事情看起来很荒谬。没有特别的理由为什么我选择索引7,但想法是调整所有日期(1-31),这也有同样的影响。
编辑包含所有代码(很少可以省略表达手头的问题)
的 TestCode.java 的
package testpackage;
import java.awt.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.*;
public class TestCode extends JFrame{
GregorianCalendar date = new GregorianCalendar();
int month = date.get(Calendar.MONTH);
DrawCalendar window = new DrawCalendar(date);
public static void main(String[] args) {
TestCode frame = new TestCode();
frame.pack();
frame.setTitle("Calendar Project");
frame.setLocationRelativeTo(null);
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public TestCode(){
setLayout(new BorderLayout());
add(window);
}
}
DrawCalendar.java
package testpackage;
import java.awt.*;
import java.util.GregorianCalendar;
import javax.swing.*;
public class DrawCalendar extends JPanel{
private JLabel[] dayBoxNumbers;
private JLabel month = new JLabel("Month");
private JLabel[] days = {
new JLabel("Sunday"),
new JLabel("Monday"),
new JLabel("Tuesday"),
new JLabel("Wednesday"),
new JLabel("Thursday"),
new JLabel("Friday"),
new JLabel("Saturday")
};
private JPanel window = new JPanel(new GridLayout(2,1));
private JPanel topLabels = new JPanel(new GridLayout(2,1));
private JPanel dayLabels = new JPanel(new GridLayout(1, 7));
private JPanel dayBoxes = new JPanel(new GridLayout(0,7));
public DrawCalendar(GregorianCalendar date){
//put days and month into topLabels then add topLabels to UI
for(int x = 0; x < 7; x++){
dayLabels.add(days[x]);
}
month.setHorizontalAlignment(SwingConstants.CENTER);
topLabels.add(month);
topLabels.add(dayLabels);
window.add(topLabels, BorderLayout.NORTH);
window.add(dayBoxes, BorderLayout.CENTER);
add(window);
//Find the grid square to start the date
int firstDay = getFirstDay(date);
int lastDay = date.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
addDaySquares(firstDay, lastDay);
}
private void addDaySquares(int first, int last){
//Create blank entries into the grid
for(int i = 1; i < first; i++){
dayBoxes.add(new JLabel(""));
}
//create array of JLabels for day boxes
dayBoxNumbers = new JLabel[last];
for(int x=0; x < last; x++){
dayBoxNumbers[x] = new JLabel(String.valueOf(x+1));
}
//Add JLabels to the grid and edit properties
for(int j=0; j < last; j++){
dayBoxNumbers[j].setBorder(BorderFactory.createLineBorder(Color.black));
dayBoxNumbers[j].setHorizontalAlignment(SwingConstants.RIGHT);
dayBoxNumbers[j].setVerticalAlignment(SwingConstants.TOP);
dayBoxNumbers[1].setPreferredSize(new Dimension(30,40));
dayBoxes.add(dayBoxNumbers[j]);
}
}
private int getFirstDay(GregorianCalendar firstDay){
firstDay.set(GregorianCalendar.DAY_OF_MONTH, 1);
return firstDay.get(GregorianCalendar.DAY_OF_WEEK);
}
}
答案 0 :(得分:3)
我:
猜测 - 您使用的是GridLayout吗?如果是这样,设置组件的大小可以设置所有组件的大小。是的,我们确实需要查看更多代码,并且不希望看到所有代码。最好发布一个最小的可编译和可运行的示例,我们可以测试,修改和帮助纠正,一个没有与问题无关的代码,sscce
您:
我正在使用网格布局。有没有办法在一个特定元素中设置每个网格的大小? IE仅调整持有日历日的所有网格方块,但不调整包含拼写天数的网格?
根据我的猜测,您已经确认您实际上正在使用GridLayout。您可能需要使用更复杂的布局,包括嵌套JPanels,每个都使用自己的布局,或者考虑使用GridBagLayout或MigLayout。
要获得更好的帮助,请考虑创建并向我们展示您的sscce。
编辑2
是的,你正在使用GridLayout来做所有事情。不要那样做。而是将JPanels嵌套在其他布局中。例如,主JPanel可以使用BoxLayout沿页面轴放置所有内容,然后你可以有一个标题JPanel,它使用FlowLayout并保持标题JLabel,一周的JPanel使用带有7列的GridLayout,以及你的日历JPanel保存日期并使用GridLayout。
答案 1 :(得分:0)
如果要调整所有JLabel的大小,则应使用
if (int j=0; j<last; j++){
dayBoxNumbers[j].setPreferredSize(new Dimension(30,40));
}
您已将JLabel索引1的大小设置为不同
dayBoxNumbers[1].setPreferredSize(new Dimension(30,40)); //why this?