Yangi boshlanuvchilar uchun qo'llanma Logisimga xush kelibsiz!
Download 1.38 Mb.
|
Logisim
Kulrang kod hisoblagichi
Logisim kutubxonalariga yo'naltirilganlik foydalanuvchiga Poke Tool yordamida joriy qiymatini o'zgartirishga va Text Tool yordamida komponentga yorliq qo'yishga imkon beruvchi juda murakkab kulrang kod hisoblagichi bilan yakunlanadi. Shuningdek, u ushbu vosita bilan bog'langan tadqiqotchida paydo bo'ladigan belgini moslashtiradi. GreyCounter com.cburch.gray paketi; import java.net.URL; import javax.swing.ImageIcon; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringUtil; /** Kulrang kodlar ustida takrorlanadigan hisoblagich ishlab chiqaradi. Bu ko'rsatadi * SimpleGrayCounter sinfidan tashqari bir nechta qo'shimcha funktsiyalar. */ Class GrayCounter InstanceFactory-ni kengaytiradi { umumiy GreyCounter() { super("Kulrang hisoblagich"); setOffsetBounds(Bounds.create(-30, -15, 30, 30)); setPorts(yangi port[] { yangi port(-30, 0, Port.INPUT, 1), yangi port (0, 0, Port.OUTPUT, StdAttr.WIDTH), }); // Biz kenglik, label va label shrift atributlariga ega bo'lamiz. Oxirgi ikkitasi // atributlar bizga yorliqni komponent bilan bog'lash imkonini beradi (garchi // yorliqlarni sozlash uchun bizga configureNewInstance ham kerak bo'ladi // Manzil). setAttributes( yangi atribut[] { StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { BitWidth.create(4), "", StdAttr.DEFAULT_LABEL_FONT }); // Quyidagi usulni chaqirish misolni shunday o'rnatadi // holatni Poke Tool yordamida boshqarish mumkin. setInstancePoker(CounterPoker.class); // Ushbu keyingi ikkita satr uni Explorer oynasida a ko'rsatadigan tarzda o'rnatadi // komponent turini ifodalovchi moslashtirilgan belgi. Bu a bo'lishi kerak // 16x16 rasm. URL url = getClass().getClassLoader().getResource("com/cburch/gray/counter.gif"); if(url != null) setIcon(yangi ImageIcon(url)); } /** configureNewInstance usuli har safar yangi misolda chaqiriladi * yaratilgan. Superklassda usul hech narsa qilmaydi, chunki * yangi namuna sukut bo'yicha allaqachon to'liq sozlangan. Lekin * ba'zan siz har bir misol uchun alohida biror narsa qilishingiz kerak, shuning uchun siz * usulni bekor qiladi. Bunday holda, biz joyni o'rnatishimiz kerak * yorlig'i uchun. */ himoyalangan void configureNewInstance (Instance instance) { Chegaralar bds = instance.getBounds(); instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, bds.getX() + bds.getWidth() / 2, bds.getY() - 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } ommaviy bekor qilish (InstanceState holati) { // Bu SimpleGrayCounter bilan bir xil, faqat biz foydalanamiz // StdAttr.WIDTH atributi bilan ishlash uchun bit kengligini aniqlash. BitWidth kengligi = state.getAttributeValue(StdAttr.WIDTH); CounterData cur = CounterData.get (holat, kenglik); mantiqiy trigger = cur.updateClock(state.getPort(0)); if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue())); state.setPort(1, cur.getValue(), 9); } public void paintInstance (InstancePainter rassomi) { // Bu SimpleGrayCounter bilan bir xil, bundan tashqari // yorliqni chizish uchun painter.drawLabel chaqiruvi. painter.drawBounds(); painter.drawClock(0, Direction.EAST); painter.drawPort(1); painter.drawLabel(); agar(painter.getShowState()) { BitWidth kengligi = painter.getAttributeValue(StdAttr.WIDTH); CounterData holati = CounterData.get(rassom, kenglik); Chegaralar bds = painter.getBounds(); GraphicsUtil.drawCenteredText(painter.getGraphics(), StringUtil.toHexString(width.getWidth(), state.getValue().toIntValue()), bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); } } } CounterPoker com.cburch.gray paketi; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.StdAttr; /** Foydalanuvchi CounterPoker ob'ekti bo'lgan Poke Tool yordamida hisoblagichni bosganda * yaratiladi va bu ob'ekt barcha foydalanuvchi hodisalarini boshqaradi. Shu esta tutilsinki * CounterPoker GrayCounter-ga xos bo'lgan sinf bo'lib, u a bo'lishi kerak * com.cburch.logisim.instance to'plamidagi InstancePoker pastki sinfi. */ umumiy sinf CounterPoker InstancePoker kengaytiradi { ommaviy CounterPoker() { } /** Sichqoncha bosilgan joyning natija berishi kerakligini aniqlaydi * poke boshlashda. */ ommaviy boolean init (InstanceState holati, MouseEvent e) { return state.getInstance().getBounds().o'z ichiga oladi(e.getX(), e.getY()); // Asosiy to'rtburchakning istalgan joyi poklashni boshlaydi. Foydalanuvchi mumkin // yorliq ichida bosgan, lekin bu chegaradan tashqarida bo'ladi. } /** Karet tanlanganligini ko'rsatuvchi indikatorni chizadi. Mana, biz chizamiz * qiymat atrofida qizil to'rtburchak. */ umumiy bekor bo'yoq (InstancePainter rassomi) { Chegaralar bds = painter.getBounds(); BitWidth kengligi = painter.getAttributeValue(StdAttr.WIDTH); int len = (width.getWidth() + 3) / 4; Grafika g = painter.getGraphics(); g.setColor(Color.RED); int kengligi = 7 * len + 2; // karetli to'rtburchakning kengligi int ht = 16; // karet to'rtburchak balandligi g.drawRect(bds.getX() + (bds.getWidth() - keng) / 2, bds.getY() + (bds.getHeight() - ht) / 2, kenglik, ht); g.setColor(Color.BLACK); } /** Kalitni joriy qiymatning oxiriga qo'shish orqali qayta ishlaydi. */ public void keyTyped(InstanceState holati, KeyEvent e) { // uni olti burchakli raqamga aylantirish; agar u olti burchakli raqam bo'lmasa, bekor qiling. int val = Character.digit(e.getKeyChar(), 16); BitWidth kengligi = state.getAttributeValue(StdAttr.WIDTH); if(val 0 || (val & width.getMask()) != val) qaytarish; // keyingi qiymatni hisoblang CounterData cur = CounterData.get (holat, kenglik); int newVal = (cur.getValue().toIntValue() * 16 + val) & width.getMask(); Qiymat newValue = Value.createKnown(kenglik, newVal); cur.setValue(newValue); state.fireInvalidated(); // Siz bu erda darhol qiymatni targ'ib qilish vasvasasiga tushishingiz mumkin // state.setPort. Biroq, sxema hozirda tarqalayotgan bo'lishi mumkin // boshqa mavzu va setPort-ni to'g'ridan-to'g'ri chaqirish xalaqit berishi mumkin // bu. FireInvalidated-dan foydalanish tarqalish oqimini xabardor qiladi // keyingi imkoniyatda hisoblagichda propagateni chaqiring. } } Download 1.38 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling