1

すべての 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);
}
}
4

2 に答える 2

3

自分:

推測-GridLayoutを使用していますか?その場合、コンポーネントのサイズを設定すると、すべてのコンポーネントのサイズを設定できます。はい、もっと多くのコードを見る必要があり、すべてを見たくはありません。最小限のコンパイル可能で実行可能な例を投稿するのが最善です。テスト、変更、修正に役立つもの、問題に関係のないコードがないもの、sscce

君:

グリッドレイアウトを使用しています。1つの特定の要素で各グリッドの正方形のサイズを設定する方法はありますか?IEは、暦日を保持するすべてのグリッドスクエアのサイズを変更するだけで、スペルアウトされた日を保持するグリッドのサイズは変更しませんか?

私の推測によると、実際にGridLayoutを使用していることを確認しました。それぞれ独自のレイアウトを使用するJPanelsをネストするなど、より複雑なレイアウトを使用する必要があるか、GridBagLayoutまたはMigLayoutの使用を検討する必要があります。

より良いヘルプが必要な場合は、sscceを作成して表示することを検討してください。

編集2
ええ、あなたはすべてにGridLayoutを使用しています。そうしないでください。代わりに、JPanelsを他のレイアウトでネストします。たとえば、メインのJPanelはすべてをページ軸に沿って配置するBoxLayoutを使用できます。次に、FlowLayoutを使用して見出しJLabelを保持する見出しJPanel、7列のGridLayoutを使用する曜日JPanel、およびカレンダーJPanelを使用できます。日付を保持し、GridLayoutを使用します。

于 2012-12-15T05:46:42.427 に答える
0

If you want to resize all JLabels you should use

if (int j=0; j<last; j++){
   dayBoxNumbers[j].setPreferredSize(new Dimension(30,40));
}

you had set the size of JLabel index 1 different

dayBoxNumbers[1].setPreferredSize(new Dimension(30,40)); //why this?
于 2012-12-15T05:53:33.663 に答える